无法将 MySQL 数据输出到文件

dot*_*hen 13 mysql linux permissions

我正在尝试将 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>
Run Code Online (Sandbox Code Playgroud)

如果有问题的目录被chmodded为777,那么为什么MySQL用户不能写入文件?有趣的是,我也不能写入 /tmp/。

编辑: 看起来数据库用户具有适当的 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)
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 13

根据SELECT ... INTO OUTFILE上的 MySQL 文档

任何由 INTO OUTFILE 或 INTO DUMPFILE 创建的文件都可以被服务器主机上的所有用户写入。这样做的原因是 MySQL 服务器不能创建一个文件,该文件由它运行的帐户下的用户以外的任何人拥有。(出于这个和其他原因,您永远不应该以 root 身份运行 mysqld。)因此该文件必须是全局可写的,以便您可以操作其内容。

你应该输出SELECT INTO OUTFILE到 /var/lib/mysql 如下

SELECT * FROM data INTO OUTFILE 'data.csv';
Run Code Online (Sandbox Code Playgroud)

当然,您需要确保您对 gs@localhost 具有 FILE 权限。

有两种方法可以获得此权限

方法#1

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

方法#2

UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

更新 2012-05-01 07:09 EDT

要给自己 FILE 权限,请执行以下操作:

service mysql restart --skip-networking --skip-grant-tables
mysql <hit enter>
UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
exit
service mysql restart
Run Code Online (Sandbox Code Playgroud)