Невозможно установить secure_file_priv в MySQL 5.7 на Ubuntu 16.04

Вопрос или проблема

Как задать значение для secure_file_priv?

Я нашел информацию о том, какие настройки могут быть использованы
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv

Сервер mysql запускается без каких-либо параметров командной строки. Ничто не переопределяет его файл .cnf.

user@server:~$ ps aux | grep [m]ysql
mysql     4495  0.0  7.0 544368 144924 ?       Ssl  09:16   0:02 /usr/sbin/mysqld

Выполнение :~$ mysqld --verbose --help сообщает мне

Опции по умолчанию читаются из следующих файлов в указанном порядке:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

Существуют только второй файл. Это начало цепочки символических ссылок на
/etc/mysql/my.cnf.migrated следующим образом…

user@server:~$ ls -l /etc/mysql/my.cnf
lrwxrwxrwx 1 root root 24 Aug 12 15:15 /etc/mysql/my.cnf -> /etc/alternatives/my.cnf
user@server:~$ ls -l /etc/alternatives/my.cnf
lrwxrwxrwx 1 root root 26 Aug 12 15:15 /etc/alternatives/my.cnf -> /etc/mysql/my.cnf.migrated
user@server:~$ ls -l /etc/mysql/my.cnf.migrated
-rw-r--r-- 1 root root 4455 Dec 13 03:18 /etc/mysql/my.cnf.migrated

Я пробовал устанавливать значения для secure_file_priv в этом последнем файле, перезапускал сервер mysql и даже перезагружал сервер Ubuntu. Независимо от установленного значения команда

mysql> SELECT @@GLOBAL.secure_file_priv;

всегда возвращает /var/lib/mysql-files/.

Я также искал другие файлы .cnf и пробовал устанавливать значение для secure_file_priv в каждом из них

user@server:~$ find /etc -iname "m*.cn*" -type f
/etc/mysql/conf.d/mysql.cnf
/etc/mysql/my.cnf.migrated
/etc/mysql/my.cnf.fallback
/etc/mysql/mysql.conf.d/mysqld.cnf
/etc/mysql/mysql.cnf

Без изменений. После внесения изменений, перезапуска сервера и проверки значения с помощью

mysql> SELECT @@GLOBAL.secure_file_priv;

результат /var/lib/mysql-files/ всегда остается прежним. Он не меняется.

Что мне нужно сделать, чтобы установить значение для secure_file_priv?

Добавьте переменную в секцию [mysqld] файла /etc/mysql/my.cnf:

secure_file_priv=/absolute/path

Затем перезапустите службу mysql.

Проверьте с помощью SELECT @@secure_file_priv;

Это сработало для меня:

Добро пожаловать в монитор MySQL. Команды заканчиваются ; или \g.
Ваш идентификатор соединения MySQL 2
Версия сервера: 5.7.16 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle и/или его дочерние компании. Все права защищены.

Oracle является зарегистрированным товарным знаком корпорации Oracle и/или ее дочерних компаний. Другие названия могут быть товарными знаками их соответствующих владельцев.

Введите 'help;' или '\h' для помощи. Введите '\c', чтобы очистить текущее выражение ввода.

mysql [localhost] {msandbox} ((none)) > select @@secure_file_priv;
+--------------------+
| @@secure_file_priv |
+--------------------+
| /tmp/              |
+--------------------+
1 row in set (0.00 sec)

Чтобы избежать получения ошибки ERROR 1290, например:

 mysql [localhost] {msandbox} (test) > select * from t1 into outfile 'file.sql';
ERROR 1290 (HY000): Сервер MySQL запущен с опцией --secure-file-priv, поэтому он не может выполнить это выражение

Убедитесь, что вы используете абсолютные пути, такие как:

mysql [localhost] {msandbox} (test) > select * from t1 into outfile '/tmp/file.sql';
Запрос выполнен, 1 строка затронута (0.00 sec)

mysql [localhost] {msandbox} (test) > \! ls /tmp/file.sql
/tmp/file.sql

mysql [localhost] {msandbox} (test) > truncate t1;
Запрос выполнен, 0 строк затронуто (0.04 sec)

mysql [localhost] {msandbox} (test) > load data infile '/tmp/file.sql' into table t1;
Запрос выполнен, 1 строка затронута (0.00 sec)
Записи: 1  Удалено: 0  Пропущено: 0  Предупреждений: 0

Ответ или решение

Для изменения значения параметра secure_file_priv в MySQL 5.7 на Ubuntu 16.04 выполните следующие шаги:

  1. Редактирование конфигурационного файла: Откройте файл конфигурации MySQL, который обычно находится по пути /etc/mysql/my.cnf или /etc/mysql/mysql.conf.d/mysqld.cnf. Вам нужно добавить или изменить следующий параметр в секции [mysqld]:

    [mysqld]
    secure_file_priv=/absolute/path

    Замените /absolute/path на полный путь к директории, в которую вы хотите разрешить экспорт и импорт файлов. Убедитесь, что у MySQL есть права на запись в эту директорию.

  2. Перезапуск MySQL: После внесения изменений необходимо перезапустить MySQL для применения новых настроек. Это можно сделать с помощью следующей команды:

    sudo systemctl restart mysql
  3. Проверка значения: После перезапуска сервера проверьте, верное ли значение у параметра secure_file_priv, выполнив следующий запрос в MySQL:

    SELECT @@GLOBAL.secure_file_priv;

    Если всё было сделано правильно, вы должны увидеть указанный вами путь.

  4. Использование абсолютных путей: При выполнении операций с файлами, таких как SELECT ... INTO OUTFILE или LOAD DATA INFILE, обязательно используйте абсолютные пути, поскольку MySQL будет проверять путь к файлу на соответствие значению secure_file_priv.

    Пример использования:

    SELECT * FROM your_table INTO OUTFILE '/absolute/path/file.sql';
    LOAD DATA INFILE '/absolute/path/file.sql' INTO TABLE your_table;

Если после выполнения вышеперечисленных шагов значение secure_file_priv по-прежнему не меняется, убедитесь, что вы редактируете правильный конфигурационный файл и у вас есть права на его редактирование. Также проверьте наличие других конфигурационных файлов, которые могут перекрывать ваше изменение. Не забывайте проверять, что MySQL действительно перезапускается, а не используется его старая инстанция, особенно если вы используете системы управления сервисами.

При возникновении ошибок, таких как ERROR 1290, удостоверяйтесь, что ваши SQL-запросы корректны и соответствуют установленным правилам безопасности MySQL.

Оцените материал
Добавить комментарий

Капча загружается...