MYSQL в outfile "access denied" - но мой пользователь имеет доступ "ВСЕ".. и папка CHMOD 777
Любые идеи?
SELECT * INTO OUTFILE '/home/myacnt/docs/mysqlCSVtest.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '*'
LINES TERMINATED BY '\n'
FROM tbl_property
WHERE managerGroupID = {$managerGroupID}
Ошибка:
Access denied for user 'asdfsdf'@'localhost' (using password: YES)
Ответы
Ответ 1
Попробуйте выполнить эту команду SQL:
> grant all privileges
on YOUR_DATABASE.*
to 'asdfsdf'@'localhost'
identified by 'your_password';
> flush privileges;
Кажется, что у вас возникли проблемы с подключением к базе данных, а не с записью в указанную вами папку.
Кроме того, убедитесь, что вы предоставили FILE
пользователю 'asdfsdf'@'localhost'
.
> GRANT FILE ON *.* TO 'asdfsdf'@'localhost';
Ответ 2
Честно говоря, я не разбирался в грантах, и это работало даже без привилегий:
echo "select * from employee" | mysql --host=HOST --port=PORT --user=UserName --password=Password DATABASE.SCHEMA > output.txt
Ответ 3
Как говорит @fijaaron,
-
GRANT ALL
не означает GRANT FILE
-
GRANT FILE
работает только с *.*
Итак,
GRANT FILE ON *.* TO user;
Ответ 4
Так как cP/WHM убрал возможность изменять привилегии пользователя как root в PHPMyAdmin, вы должны использовать командную строку для:
mysql> GRANT FILE ON *.* TO 'user'@'localhost';
Шаг 2 - разрешить пользователю выгружать файл в определенную папку. Есть несколько способов сделать это, но в итоге я вложил папку в папку
/home/user/tmp/db
и
chown mysql:mysql /home/user/tmp/db
Это позволяет пользователю mysql записывать файл. Как уже отмечали предыдущие плакаты, вы также можете использовать временную папку MySQL, я не думаю, что это действительно важно, но вы определенно не хотите, чтобы это разрешение 0777 (доступно для записи в мире), если вы не хотите, чтобы мир видел ваши данные. Существует потенциальная проблема, если вы хотите промыть-повторить процесс, поскольку INTO OUTFILE
не будет работать, если файл существует. Если ваши файлы принадлежат другому пользователю, тогда просто попытка unlink($file)
не будет работать. Если вы похожи на меня (параноидальный около 0777), вы можете установить целевой каталог, используя:
chmod($dir,0777)
перед выполнением команды SQL, затем
chmod($dir,0755)
сразу после, а затем unlink(file)
, чтобы удалить файл. Это заставляет все работать под вашим веб-пользователем и не нужно вызывать пользователя mysql.
Ответ 5
Я перепробовал все решения, но этого было недостаточно. После еще нескольких копаний я обнаружил, что мне нужно было установить флаг 'file_priv' и перезапустить mysql.
Для возобновления:
Предоставьте привилегии:
> GRANT ALL PRIVILEGES
ON my_database.*
to 'my_user'@'localhost';
> GRANT FILE ON *.* TO my_user;
> FLUSH PRIVILEGES;
Установите флаг:
> UPDATE mysql.user SET File_priv = 'Y' WHERE user='my_user' AND host='localhost';
Наконец, перезапустите сервер MySQL:
$ sudo service mysql restart
После того, что я мог написать в каталог secure_file_priv
. Для меня это был /var/lib/mysql-files/, но вы можете проверить это с помощью следующей команды:
> SHOW VARIABLES LIKE "secure_file_priv";