Невозможно вывести данные MySQL в файл


13

Я пытаюсь вывести данные из таблицы MySQL в файл, но получаю ошибки разрешения:

$ pwd
/home/dotancohen
$ mkdir in
$ chmod 777 in/
$ mysql -ugs -p
mysql> USE someDatabase;
mysql> SELECT * FROM data INTO OUTFILE '/home/dotancohen/in/data.csv';
ERROR 1045 (28000): Access denied for user 'gs'@'localhost' (using password: YES)
mysql>

Если соответствующий каталог chmodded 777, то почему пользователь MySQL не может записать файл? Интересно, что я тоже не могу писать в / tmp /.

РЕДАКТИРОВАТЬ: похоже, пользователь БД имеет соответствующие разрешения MySQL:

mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for gs@localhost                                                          |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'gs'@'localhost' IDENTIFIED BY PASSWORD 'somePassword'     | 
| GRANT ALL PRIVILEGES ON `gs\_%`.* TO 'gs'@'localhost'                            | 
+----------------------------------------------------------------------------------+
2 rows in set (0.01 sec)

2
Вы должны предоставить права доступа к MySQL по всему дереву каталогов. Предоставлять права на inбессмысленно, если MySQL не может получить доступ dotanchoen. Другими словами, ящик безопасного депо в банковском хранилище можно оставить широко открытым, но если дверь банковского хранилища закрыта, вы не попадете в ящик. Ваш gsпользователь также должен иметь FILEпривилегию mysql для фактического выполнения этого запроса.

Проблема в том, что у вас может не быть выбранной химической завивки? Разрешения Mysql не контролируются разрешениями каталога. Вам нужно использовать mysql -u <username> -p для запуска от имени конкретного пользователя mysql. Чтобы предоставить пользователю доступ к БД, посмотрите грант MySql. dev.mysql.com/doc/refman/5.1/ru/grant.html

Спасибо, у этого пользователя есть SELECTразрешения. Я часто просматриваю базу данных как этот пользователь.
dotancohen

Спасибо, Марк, это то, чего я боялся. Поэтому у меня не может быть папки «Входящие», в которую другие пользователи могут писать, не позволяя им также читать / писать в мой домашний каталог?
dotancohen

2
Убедитесь, что у пользователя есть FILEпривилегия, как описано в MySQL docs .
Майк Перселл

Ответы:


12

Согласно документации MySQL на SELECT ... INUT OUTFILE

Любой файл, созданный INTO OUTFILE или INTO DUMPFILE, доступен для записи всем пользователям на хосте сервера. Причина этого заключается в том, что сервер MySQL не может создать файл, принадлежащий кому-либо, кроме пользователя, под учетной записью которого он работает. (Вы никогда не должны запускать mysqld от имени пользователя root по этой и другим причинам.) Таким образом, файл должен быть доступен для записи всем пользователям, чтобы вы могли манипулировать его содержимым.

Вы должны вывести SELECT INTO OUTFILEto / var / lib / mysql следующим образом

SELECT * FROM data INTO OUTFILE 'data.csv';

Конечно, вам нужно убедиться, что у вас есть разрешение FILE на gs @ localhost.

Есть два способа получить это разрешение

МЕТОД №1

GRANT FILE ON *.* TO 'gs'@'localhost';

МЕТОД № 2

UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
FLUSH PRIVILEGES;

ОБНОВЛЕНИЕ 2012-05-01 07:09 ПО ВОСТОЧНОМУ ВРЕМЕНИ

Чтобы дать себе привилегию FILE, сделайте следующее:

  • ШАГ 01) service mysql restart --skip-networking --skip-grant-tables
  • ШАГ 02) mysql <hit enter>
  • ШАГ 03) UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
  • ШАГ 04) exit
  • ШАГ 05) service mysql restart

Благодарю. Я обновил вопрос с выводом SHOW GRANTS. Похоже, пользователь БД должен иметь соответствующие разрешения.
dotancohen

Пользователь БД не имеет надлежащих разрешений. Привилегия FILE предоставляется только пользователю GRANT ALL PRIVILEGES ON *.*, как RELOADи SHUTDOWN. Это так, потому что это глобальные административные привилегии. У GRANT ALLвас есть привилегия только для gsбазы данных.
RolandoMySQLDBA

1

Различные дистрибутивы и операционные системы не все обрабатывают назначения для OUTFILE одинаково.

Например, при запуске демона mysqld в Linux, который использует сокет, OUTFILE иногда записывается в /tmpкаталог. Ничего страшного, просто использование подхода OUTFILE имеет недостатки, а именно, имеет дело с разрешениями и поиском того, куда файл пошел.

Поскольку целью этого вопроса является не «Как использовать OUTFILE», а просто собирать некоторые данные MySQL в файл, вот альтернатива, которая не требует, чтобы вы вертелись с разрешениями FILE и т. Д. ,

$ (echo 'SELECT * FROM data' | mysql -ugs -p[password])> /home/dotancohen/in/data.csv

Выходные данные по умолчанию разделены табуляцией. Для запятых, просто передайте это sedили что-то перед записью в файл.


1

Я часами пытался понять предложения на этой и многих других страницах StackOverflow.

Независимо от того, как я изменил разрешения в MySql, я ничего не мог заставить работать.

Я вернулся к разрешениям, с которых начал.

В конечном счете, то, что работало для меня, было проще, чем предложения других:

echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsv


1
Ваш метод хорош для использования в Bash CLI. Однако вопрос в ОП задает вопрос о том, как выводить данные в файл из клиентского CLI MySQL.
dotancohen

0

Что касается двух методов вывода данных в CSV (должен быть действительно TSV), упомянутых выше, я обнаружил, что если в экспортируемых записях есть пустые значения , существует риск того, что данные могут быть испорчены из-за неправильного выделения данные в соответствующие столбцы.

С заботой о целостности данных для восстановления, я нашел этот сайт:

https://www.eversql.com/exporting-mysql-schema-structure-to-xml-using-mysql-clients/

Он упомянул, что --xmlопция mysqldumpпозволяет экспортировать данные в формат XML, который затем может быть проанализирован с помощью специального скрипта в любой необходимый формат, включая TSV.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.