MYSQL进入outfile"访问被拒绝" - 但我的用户有"全部"访问..并且该文件夹是CHMOD 777

Sha*_*ock 70 mysql mysql-error-1045 into-outfile

有任何想法吗?

SELECT * INTO OUTFILE '/home/myacnt/docs/mysqlCSVtest.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '*'
LINES TERMINATED BY '\n'
FROM tbl_property 
WHERE managerGroupID = {$managerGroupID}
Run Code Online (Sandbox Code Playgroud)

错误:

Access denied for user 'asdfsdf'@'localhost' (using password: YES)
Run Code Online (Sandbox Code Playgroud)

Pab*_*ruz 111

尝试执行此SQL命令:

> grant all privileges 
  on YOUR_DATABASE.* 
  to 'asdfsdf'@'localhost' 
  identified by 'your_password';
> flush privileges; 
Run Code Online (Sandbox Code Playgroud)

您似乎遇到连接数据库而不写入您提到的文件夹的问题.

此外,请确保您已授予FILE用户'asdfsdf'@'localhost'.

> GRANT FILE ON *.* TO 'asdfsdf'@'localhost';
Run Code Online (Sandbox Code Playgroud)

  • 这里有两个问题.1)GRANT ALL不做GRANT FILE.2)GRANT FILE仅适用于\*.\*(即全局).两者都是MySQL中的错误. (45认同)
  • 仅供参考,在做这个之前要仔细考虑,你不是数据库管理员.我很高兴发现我改变了特权("Nooooooo!").:-) (3认同)
  • @Shackrock:查看更新的答案。确保您已将“FILE”授予用户。 (2认同)
  • 您不必在`GRANT`之后使用`FLUSH PRIVILEGES`。仅当您使用SQL而不是`GRANT`修改权限表时才需要。 (2认同)

小智 45

老实说,我没有费心去处理补助金,即使没有特权,这也很有效:

echo "select * from employee" | mysql --host=HOST --port=PORT --user=UserName --password=Password DATABASE.SCHEMA > output.txt
Run Code Online (Sandbox Code Playgroud)

  • MySQL将使用此方法制表分隔文件,这是完美的.在尝试了十几个文件权限,MySQL设置和各种授权之后,所有这些都覆盖了5个或6个不同的帮助页面.省去头痛并使用它. (6认同)
  • 那是因为你只是做一个普通的SELECT,而不是SELECT INTO OUTFILE(在这种情况下是一个.csv文件). (5认同)
  • 对于较大的表,这是一种不好的方法,因为客户端在将任何内容放到文件之前缓冲整个结果集. (5认同)
  • 当你无法获得FILE的权利时很好用 (4认同)

e18*_*18r 19

正如@fijaaron所说,

  1. GRANT ALL 并不意味着 GRANT FILE
  2. GRANT FILE 只适用于 *.*

那样做

GRANT FILE ON *.* TO user;
Run Code Online (Sandbox Code Playgroud)


Gri*_*lay 6

由于 cP/WHM 取消了在 PHPMyAdmin 中以 root 身份修改用户权限的能力,因此您必须使用命令行来:

mysql>  GRANT FILE ON *.* TO 'user'@'localhost';
Run Code Online (Sandbox Code Playgroud)

第 2 步是允许该用户将文件转储到特定文件夹中。有几种方法可以做到这一点,但我最终将一个文件夹放入:

/home/user/tmp/db
Run Code Online (Sandbox Code Playgroud)

chown mysql:mysql /home/user/tmp/db
Run Code Online (Sandbox Code Playgroud)

这允许 mysql 用户写入该文件。正如之前的发帖者所说,您也可以使用 MySQL 临时文件夹,我认为这并不重要,但您绝对不想将其设置为 0777 权限(世界可写),除非您希望全世界都看到您的数据。如果您想冲洗重复该过程,则存在潜在问题,因为INTO OUTFILE如果文件存在,则该过程将不起作用。如果您的文件归其他用户所有,那么仅仅尝试是unlink($file)行不通的。如果您像我一样(对 0777 感到偏执),那么您可以使用以下方法设置目标目录:

chmod($dir,0777)
Run Code Online (Sandbox Code Playgroud)

在执行 SQL 命令之前,然后

chmod($dir,0755)
Run Code Online (Sandbox Code Playgroud)

紧接着,然后unlink(file)删除该文件。这使其全部在您的 Web 用户下运行,无需调用 mysql 用户。