无法将MySQL数据输出到文件


13

我正在尝试将数据从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>

如果有问题的目录更改为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)

2
您必须在整个目录树上授予对MySQL的访问权限。in如果MySQL无法访问,授予权利是没有意义的dotanchoen。换句话说,可以将银行保险库中的安全邮政信箱保持打开状态,但是如果银行保险库门已锁定,则您不会进入保险柜中。您的gs用户还必须具有mysql FILE特权才能实际执行该查询。

问题是您可能没有选择的烫发?Mysql权限不受目录权限的控制。您需要使用mysql -u <用户名> -p以特定的mysql用户身份运行。要授予用户对数据库的访问权限,请看一下MySql授予。dev.mysql.com/doc/refman/5.1/en/grant.html

谢谢,此用户确实具有SELECT权限。我经常以该用户身份浏览数据库。
dotancohen 2012年

谢谢,马克,这就是我所担心的。因此,我不能拥有其他用户可以写入的“收件箱”文件夹,而又不让他们读取/写入我的主目录吗?
dotancohen 2012年

2
确保用户具有MySQL文档FILE所述的特权。
Mike Purcell 2012年

Answers:


12

根据有关SELECT ... INTO OUTFILE的 MySQL文档

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

您应该SELECT INTO OUTFILE按照以下方式将输出输出到/ var / lib / mysql

SELECT * FROM data INTO OUTFILE 'data.csv';

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

授予此权限有两种方法

方法1

GRANT FILE ON *.* TO 'gs'@'localhost';

方法#2

UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
FLUSH PRIVILEGES;

更新美国东部时间2012-05-01 07:09

要赋予自己FILE特权,请执行以下操作:

  • 步骤01) service mysql restart --skip-networking --skip-grant-tables
  • 步骤02) mysql <hit enter>
  • 步骤03) UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
  • 步骤04) exit
  • 步骤05) service mysql restart

谢谢。我用的输出更新了问题SHOW GRANTS。看来数据库用户应该具有适当的权限。
dotancohen 2012年

数据库用户没有适当的权限。FILE权限只授予用户使用GRANT ALL PRIVILEGES ON *.*,就像RELOADSHUTDOWN。之所以如此,是因为这些是全局管理特权。GRANT ALL您拥有的特权gs仅适用于数据库。
RolandoMySQLDBA'5年

1

不同的发行版和操作系统并不能完全一样地处理OUTFILE的目的地

例如,当在使用套接字的Linux上运行mysqld守护程序时,有时会将OUTFILE写入/tmp目录。没什么大不了的,只是使用OUTFILE方法有缺点,即处理权限和查找文件去向。

由于此问题的目的不是专门针对“如何使用OUTFILE”,而是您只是希望将一些MySQL数据捕获到文件中,因此这是一种替代方案,不需要您绕开FILE权限等等。 。

$ (echo 'SELECT * FROM data' | mysql -ugs -p[password])> /home/dotancohen/in/data.csv

默认情况下,此输出以制表符分隔。对于逗号,只需将其通过管道sed或其他方式传输,然后再将其写入文件。


1

我花了几个小时试图理解此页面以及StackOverflow的许多其他页面上的建议。

无论我如何更改MySql中的权限,我都无法工作。

我回到了最初的权限。

最终,对我有用的方法比其他人的建议更简单:

echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsv


1
在Bash CLI上,该方法非常适合使用。但是,OP中的问题询问有关如何从MySQL客户端CLI将数据输出到文件的问题。
dotancohen

0

关于上面提到的将数据输出到CSV的两种方法(实际上应该是TSV),我发现如果导出的条目中有空值,则存在由于配置错误而导致数据混乱的风险。数据到相应的列。

考虑到要恢复的数据完整性,我找到了以下网站:

https://www.eversql.com/exporting-mysql-schema-structure-to-xml-using-mysql-clients/

它提到,该--xml选项mysqldump允许将数据导出为XML格式,然后可以通过自定义脚本将其解析为所需的任何格式,包括TSV。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.