Скачать CSV из SQL-запроса - PullRequest
0 голосов
/ 24 августа 2018

Когда я запускаю следующий запрос:

SELECT * FROM selecteddb.mytable 
where time between "2018-08-06 00:00:00" and "2018-08-13 00:00:00"
INTO outfile "~/stats.csv" 
FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n';

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

Error Code: 1045. Access denied for user 'admin'@'%' (using password: YES)

Но когда я запускаю только запрос без outfile, он работает просто отлично.

Я использую MySQL Workbench и Mac для запуска запроса.

1 Ответ

0 голосов
/ 24 августа 2018

Похоже, у вашего admin пользователя нет привилегии FILE . Вы можете дать разрешение, и оно будет работать.

GRANT FILE ON * . * TO 'admin'@'%';

SELECT ... INTO OUTFILE 'file_name' форма SELECT записывает выделенные строки в файл. Файл создается на хосте сервера, поэтому Вы должны иметь привилегию FILE, чтобы использовать этот синтаксис. имя_файла не может быть существующим файлом, который, помимо прочего, предотвращает такие файлы как / etc / passwd и таблицы базы данных от уничтожения. Системная переменная character_set_filesystem управляет интерпретацией имени файла.

https://dev.mysql.com/doc/refman/8.0/en/select-into.html

=============================================== ==========

Также обратите внимание, что серверу mysql необходимо иметь разрешение на запись по указанному вами пути.

Привилегия FILE также позволяет пользователю создавать новые файлы в любом каталог, в котором сервер MySQL имеет доступ для записи. Это включает в себя каталог данных сервера, содержащий файлы, которые реализуют таблицы привилегий.

Если вы выполняете запрос как:

SELECT * FROM selecteddb.mytable ..... INTO outfile "~/stats.csv";

Это попытается создать файл в домашнем каталоге. Если вы пропустите пути и оставите только имя файла, он будет создан в каталоге данных Mysql. (/var/lib/mysql в моей машине с Ubuntu).

Так что это должно работать без проблем.

SELECT * FROM selecteddb.mytable ..... INTO outfile "stats.csv";

Надеюсь, это поможет!

...