MySQL ERROR 1290 (HY000) - опция -secure-file-priv

Я пытаюсь записать результаты MySQL script в текстовый файл, используя следующий код в script.

SELECT p.title, p.content, c.name FROM post p
LEFT JOIN category c ON p.category_id=c.id
INTO OUTFILE 'D:\MySql\mysqlTest.txt';

Однако, я получаю следующее

ОШИБКА 1290 (HY000): сервер MySQL работает с параметром -secure-file-priv, поэтому он не может выполнить этот оператор

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

Ответ 1

Ubuntu 16.04 (EASY): узнайте, где вам разрешено писать

mysql> SELECT @@GLOBAL.secure_file_priv;
+---------------------------+
| @@GLOBAL.secure_file_priv |
+---------------------------+
| /var/lib/mysql-files/     |
+---------------------------+
1 row in set (0.00 sec)

Тогда просто напишите там

mysql> SELECT * FROM train INTO OUTFILE '/var/lib/mysql-files/test.csv' FIELDS TERMINATED BY ',';
Query OK, 992931 rows affected (1.65 sec)

mysql>

Mac OSX: Mysql установлен через MAMP

Узнайте, где вам разрешено писать

mysql> SELECT @@GLOBAL.secure_file_priv;
+---------------------------+
| @@GLOBAL.secure_file_priv |
+---------------------------+
| NULL                      |
+---------------------------+
1 row in set (0.00 sec)

NULL означает, что вы завинчены, поэтому вам нужно создать файл "~/.my.cnf"

Включить чтение/запись для MySQL, установленного через MAMP (на Mac):

  • открыть "MAMP" использовать прожектор
  • нажмите "Остановить серверы"
  • edit ~/.my.cnf(используя vi или ваш любимый редактор) и добавьте следующие строки:

    $vi ~/.my.cnf

[mysqld_safe]
[mysqld]
secure_file_priv="/Users/russian_spy/"
  1. нажмите "Запустить серверы" (в окне MAMP)

Теперь проверьте, работает ли это:

а. start mysql (по умолчанию пользователь MAMP является root, пароль также является корневым)

$ /Applications/MAMP/Library/bin/mysql -u root -p 

б. в mysql посмотрите на перечисленные белые пути

mysql> SELECT @@GLOBAL.secure_file_priv;
+---------------------------+
| @@GLOBAL.secure_file_priv |
+---------------------------+
| /Users/russian_spy/          |
+---------------------------+
1 row in set (0.00 sec)

с. Наконец, проверьте, экспортировав таблицу train в файл CSV

mysql> SELECT * FROM train INTO OUTFILE '/Users/russian_spy/test.csv' FIELDS TERMINATED BY ',';
Query OK, 992931 rows affected (1.65 sec)

mysql>

Ответ 2

  • Отредактируйте файл (/etc/my.cnf для CentOS) или (файл my.ini для Windows)
  • Добавить secure-file-priv = "" строка в конце
  • Остановить службу mysql с помощью systemctl stop mysqld
  • Перезапустите его, используя systemctl start mysqld

Теперь он позволит вам импортировать и экспортировать данные.

Ответ 3

Вы не можете экспортировать данные, поскольку они настроены в конфигурационных файлах mysql. Откройте файл конфигурации my.cnf и проверьте.

Цитата из MySQL doc

Эта переменная используется для ограничения влияния операций импорта и экспорта данных, таких как операции, выполняемые операторами LOAD DATA и SELECT ... INTO OUTFILE, и функцией LOAD_FILE(). Эти операции разрешены только пользователям, у которых есть привилегия FILE.

secure_file_priv может быть установлен следующим образом:

  • Если пустая, переменная не имеет эффекта.

  • Если задано имя каталога, сервер ограничивает импорт и экспорт операции для работы только с файлами в этом каталоге. Каталог должен существовать; сервер не создаст его.

  • Если установлено значение NULL, сервер отключает операции импорта и экспорта. Эта значение допускается с MySQL 5.7.6.

(Пустое значение является значением по умолчанию, или оно может быть явно указано в my.cnf как secure_file_priv="". Значение <NULL может быть установлено с помощью secure_file_priv=NULL.)

Итак, если вы хотите экспортировать данные, вам необходимо прокомментировать эту опцию и перезапустить сервер mysql. Затем вы сможете экспортировать.

Ответ 4

Замените "\" на "/" в вашем пути к файлу.

Вот так:

INTO OUTFILE 'D:/MySql/mysqlTest.txt';

Ответ 5

ДЛЯ MAC OS, если установлен через HOMEBREW:

Отредактируйте my.cnf PATH: /usr/local/etc/my.cnf

Скопируйте это:

# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 0.0.0.0
secure-file-priv = ''

СПАСТИ

Объяснение: Secure_file_prive = NULL - ограничение mysqld не позволяет импортировать и экспортировать Secure_file_priv = '/tmp/' - ограничение импорта и экспорта mysqld может происходить только в /tmp/directory Secure_file_priv = '' - не ограничивает импорт mysqld

Ответ 6

Это пример моего SQL, который отлично работал в WAMP SERVER (Windows):

SELECT display_name,user_email,user_registered FROM test_wp_users
ORDER BY user_registered ASC
INTO OUTFILE 'C:/wamp64/tmp/usersbyemail.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

PS: Обратите внимание, что столбцы в пути должны быть слева направо для идеальной работы в MYSQL.

Ответ 7

В моем my.ini у меня было только

# Secure File Priv.

и я попытался поставить:

# Secure File Priv.
secure-file-priv = ""

а также

# Secure File Priv.
secure-file-priv = NULL

не заставляя это работать.

Я наконец удалил строку и оставил в покое:

secure-file-priv = ""

Работает правильно.

Ответ 8

Это потому, что для secure_file_priv установлено значение NULL

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

| secure_file_priv | NULL  |

Вы должны остановить сервер MySQL

shell>/usr/local/mysql/support-files/mysql.server stop

Затем перезапустите mysql с опцией, определяющей, куда вы хотите записать файлы, например, в /tmp

shell>/usr/local/mysql/support-files/mysql.server start --secure-file-priv=/tmp

Затем в терминале mysql вы должны увидеть, куда теперь могут быть записаны ваши файлы.

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

| secure_file_priv | /private/tmp/ |

На Mac вы можете найти эту папку, используя Go To Folder /private/tmp в Finder

Ответ 9

Просто создайте файл /etc/my.cnf со следующим содержимым

[mysqld]
secure_file_priv            = ''

Вы можете использовать этот oneliner:

echo "[mysqld]\nsecure_file_priv\t\t= ''\n" | sudo tee /etc/my.cnf

А затем перезапустите MySQL. Если brew использовался для установки mysql, выполните следующую команду:

brew services restart mysql