Вопрос или проблема
Как задать значение для 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 выполните следующие шаги:
-
Редактирование конфигурационного файла: Откройте файл конфигурации MySQL, который обычно находится по пути
/etc/mysql/my.cnf
или/etc/mysql/mysql.conf.d/mysqld.cnf
. Вам нужно добавить или изменить следующий параметр в секции[mysqld]
:[mysqld] secure_file_priv=/absolute/path
Замените
/absolute/path
на полный путь к директории, в которую вы хотите разрешить экспорт и импорт файлов. Убедитесь, что у MySQL есть права на запись в эту директорию. -
Перезапуск MySQL: После внесения изменений необходимо перезапустить MySQL для применения новых настроек. Это можно сделать с помощью следующей команды:
sudo systemctl restart mysql
-
Проверка значения: После перезапуска сервера проверьте, верное ли значение у параметра
secure_file_priv
, выполнив следующий запрос в MySQL:SELECT @@GLOBAL.secure_file_priv;
Если всё было сделано правильно, вы должны увидеть указанный вами путь.
-
Использование абсолютных путей: При выполнении операций с файлами, таких как
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.