Как мне решить --secure-file-priv в MySQL?

Я изучаю MySQL и пытаюсь использовать предложение LOAD DATA. Когда я использовал его, как показано ниже:

LOAD DATA INFILE "text.txt" INTO table mytable;

Я получил следующую ошибку:

Сервер MySQL работает с параметром --secure-file-priv, поэтому он не может выполнить этот оператор

Как решить эту ошибку?

Я проверил еще один вопрос по тому же сообщению об ошибке, но все же не смог найти решение.

Я использую MySQL 5.6

Ответ 1

Он работает по назначению. Ваш MySQL-сервер был запущен с помощью - secure-file-priv, который в основном ограничивает, из каких каталогов вы можете загружать файлы с помощью LOAD DATA INFILE.

Вы можете использовать SHOW VARIABLES LIKE "secure_file_priv";, чтобы увидеть каталог, который был настроен.

У вас есть два варианта:

  • Переместите файл в каталог, указанный secure-file-priv.
  • Отключить secure-file-priv. Это должно быть удалено из запуска и не может быть изменено динамически. Для этого проверьте параметры запуска MySQL (в зависимости от платформы) и my.ini.

Ответ 2

У меня была такая же проблема. Наконец, я решил использовать параметр LOCAL в команде

LOAD DATA LOCAL INFILE "text.txt" INTO TABLE mytable;

Вы можете найти более подробную информацию здесь http://dev.mysql.com/doc/refman/5.7/en/load-data.html

Если указан LOCAL, файл считывается клиентской программой на клиентского хоста и отправляется на сервер. Файл может быть указан как полный имя пути, чтобы указать его точное местоположение. Если задано как относительный путь имя, имя интерпретируется относительно каталога, в котором была запущена клиентская программа.

Ответ 3

В Ubuntu 14 и Mysql 5.5.53 этот параметр, по-видимому, включен по умолчанию. Чтобы отключить его, вам нужно добавить secure-file-priv = "" в файл my.cnf в группе конфигурации mysqld. например: -

[mysqld]
secure-file-priv = ""

Ответ 4

Я работаю над MySQL5.7.11 в Debian, команда, которая работала для меня, чтобы увидеть каталог:

mysql> SELECT @@global.secure_file_priv;

Ответ 5

Если файл является локальным для вашей машины, используйте ЛОКАЛЬНЫЙ в вашей команде

LOAD DATA LOCAL INFILE "text.txt" INTO table mytable;

Ответ 6

Вот что сработало для меня в Windows 7, чтобы отключить secure-file-priv (вариант # 2 из ответа vhu):

  1. Остановите службу сервера MySQL, зайдя в services.msc.
  2. Перейдите в C:\ProgramData\MySQL\MySQL Server 5.6 (ProgramData была скрытой папкой в моем случае).
  3. Откройте файл my.ini в блокноте.
  4. Ищите "secure-file-priv".
  5. Прокомментируйте строку, добавив "#" в начале строки. Для MySQL Server 5.7.16 и выше комментирование не будет работать. Вы должны установить пустую строку, например, такую: secure-file-priv=""
  6. Сохраните файл.
  7. Запустите службу сервера MySQL, зайдя в services.msc.

Ответ 7

@vhu

Я сделал SHOW VARIABLES LIKE "secure_file_priv"; и он возвратил C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ поэтому, когда я подключил его, он все равно не работал.

Когда я обратился к файлу my.ini напрямую, я обнаружил, что путь отформатирован немного по-другому: C: /ProgramData/MySQL/MySQL Server 8.0/Uploads

Затем, когда я с этим справился, это сработало. Единственная разница заключается в направлении слешей.

Ответ 8

У меня была такая же проблема с "secure-file-priv" . Комментирование в .ini файле не сработало и не перемещало файл в директорию, указанную "secure-file-priv" .

Наконец, как предположил dbc, создание "secure-file-priv" равным пустой строке. Поэтому, если кто-то застрял после того, как попробовал ответы выше, мы надеемся, что это поможет.

Ответ 9

То, что сработало для меня:

  1. Поместите свой файл в папку, указанную в secure-file-priv.

Чтобы найти этот тип:

mysql> показывать переменные типа "secure_file_priv";


  1. Проверьте, есть ли у вас local_infile = 1.

Сделайте это, набрав:

mysql> показывать переменные типа "local_infile";

Если вы получаете:

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+

Затем установите его на один набор:

mysql> set global local_infile = 1;


  1. Укажите полный путь к вашему файлу. В моем случае:

mysql> загрузить данные файла "C: /ProgramData/MySQL/MySQL Server 8.0/Uploads/file.txt" в тест таблицы;

Ответ 10

У меня были всевозможные проблемы. Я менял my.cnf и всевозможные сумасшедшие вещи, которые пытались показать другие версии этой проблемы.

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

Ошибка, которую я получал

The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

Я смог исправить это, открыв /usr/local/mysql/support -files/mysql.server и изменив следующую строку:

$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" -- $other_args >/dev/null &
  wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?

к

$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" --secure-file-priv="" $other_args >/dev/null &
  wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?

Ответ 11

У меня была эта проблема в Windows 10. "-secure-file-priv в MySQL". Чтобы решить эту проблему, я сделал следующее.

  • В окне поиска (внизу слева) я набрал "powershell".
  • Щелкните правой кнопкой мыши на powershell и запустите как admin.
  • Переместится в файл bin сервера. (C:\Program Files\MySQL\MySQL Server 5.6\bin);
  • Типированный. /mysqld
  • Хит "enter"

Сервер запускается, как ожидалось.

Ответ 12

MySQL использует эту системную переменную, чтобы контролировать, куда вы можете импортировать файлы

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv | NULL  |
+------------------+-------+

Так что проблема в том, как изменить системные переменные, такие как secure_file_priv.

  1. выключение mysqld
  2. sudo mysqld_safe --secure_file_priv=""

теперь вы можете увидеть вот так:

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv |       |
+------------------+-------+

Ответ 13

Если вы работаете в Ubuntu, вам также может понадобиться настроить Apparmor, чтобы разрешить MySQL писать в вашу папку, например, здесь моя конфигурация:

Добавьте эту строку в файл /etc/apparmor.d/usr.sbin.mysqld:

/var/lib/mysql-files/* rw

Затем добавьте эти 2 строки конфигурации в разделы /etc/mysql/my.cnf:

[client]
loose-local-infile = 1

[mysqld]
secure-file-priv = ""

Вот мой SQL:

select id from blahs into outfile '/var/lib/mysql-files/blahs';

Это сработало для меня. Удачи!

Ответ 14

Для версии MySQL 8.0 вы можете сделать это:

  1. mysql.server stop
  2. mysql.server start --secure-file-priv = ''

У меня это работало на Mac High Sierra

Ответ 15

Подробный пример того, как проверить secure_file_priv, предоставить пользователя и выбрать в выходной файл yippeecode.com