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):
[mysqld_safe]
[mysqld]
secure_file_priv="/Users/russian_spy/"
- нажмите "Запустить серверы" (в окне 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