Вывод запроса к файлу дает ошибку отказа в доступе - PullRequest
14 голосов
/ 21 марта 2009

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

select count(predicate),subject from TableA group by subject into outfile '~/XYZ/output.txt';

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

ОШИБКА 1045 (28000): доступ запрещен для пользователя 'username' @ '%' (используется пароль: YES)

Есть идеи, куда я иду не так? Это какая-то проблема, связанная с разрешением?

Ответы [ 2 ]

30 голосов
/ 21 марта 2009

Outfile - это собственное разрешение в MySQL.

Если у вас есть ВСЕ, оно включено.

Но если у вас есть только безопасная коллекция, такая как SELECT, INSERT, UPDATE, DELETE, DROP, CREATE, но не OUTFILE, "в выходной файл" не будет работать в запросах.

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

Чтобы обойти это, вы можете запустить запрос непосредственно в вывод любой оболочки или языка, который вы используете для запуска sql.

Вот пример * nix

>$ echo "select count(predicate),subject from TableA group by subject"  | mysql -u yourusername -p yourdatabasename > ~/XYZ/outputfile.txt

Но делайте все это в одной строке без "\" или используйте "\", чтобы избежать перевода строки.

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

Так что используйте mysql, чтобы получить информацию, а затем сбросьте данные в файл из собственной пользовательской оболочки, и все будет в порядке.

Или найдите способ получить разрешение mysql для выходного файла, в любом случае.

4 голосов
/ 21 октября 2014

Если это ваша система (вы администратор), и вы знаете, как ее защитить, то именно так вы включаете эти разрешения.

USE mysql;
UPDATE user SET File_priv = 'Y' WHERE User = 'db_user';
FLUSH PRIVILEGES;
...