Вывод запроса в файл дает отказ в доступе

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

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

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

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

Любая идея, где я ошибаюсь? Это проблема, связанная с разрешением?

Ответы

Ответ 1

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

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

Но если у вас просто есть безопасная коллекция, такая как SELECT, INSERT, UPDATE, DELETE, DROP, CREATE, но не OUTFILE, "в 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 для получения информации, а THEN выгрузите данные в файл из вашей собственной пользовательской оболочки, и все будет в порядке.

Или найдите способ получить внешнее mysql-разрешение в любом случае.

Ответ 2

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

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