Неможливо вивести дані 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>

Якщо відповідний каталог змінено на 777, то чому користувач MySQL не може написати файл? Цікаво, що я не можу писати в / tmp /.

EDIT: Схоже, користувач DB має належні дозволи 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 не контролюються дозволами каталогу. Для запуску як конкретного користувача mysq потрібно використовувати mysql -u <ім'я користувача> -p. Щоб надати користувачеві доступ до db, подивіться MySql grant. dev.mysql.com/doc/refman/5.1/uk/grant.html

Дякую, у цього користувача є SELECTдозволи. Я часто переглядаю базу даних як цей користувач.
dotancohen

Дякую, Марку, саме цього я боявся. Тому я не можу мати папку "Вхідні", в яку можуть писати інші користувачі, не даючи їм також читати / писати до мого домашнього каталогу?
dotancohen

2
Переконайтеся, що користувач має FILEпривілей, як описано в документах MySQL .
Майк Перселл

Відповіді:


12

Відповідно до документації MySQL на SELECT ... IN OUTFILE

Будь-який файл, створений INTO OUTFILE або INTO DUMPFILE, може бути записаний усіма користувачами сервера. Причиною цього є те, що сервер MySQL не може створити файл, яким належить хтось інший, ніж той користувач, під обліковим записом якого він працює. (Ніколи не слід запускати mysqld як root з цієї та інших причин.) Таким чином, файл повинен бути доступним для запису у світі, щоб можна було маніпулювати його вмістом.

Ви повинні вивести SELECT INTO OUTFILEфайл / 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 EDT

Щоб надати собі 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.