2009-06-24 156 views
13

我无法获得以下代码来生成任何输出。 MySQL用户拥有“全部”授予级别,/ tmp是可写的,查询返回结果集。MySQL select into outfile/tmp no output

mysql> SELECT field FROM test_table WHERE condition='test' 
    -> INTO OUTFILE '/tmp/test.csv' 
    -> FIELDS TERMINATED BY ',' 
    -> ENCLOSED BY '"' 
    -> LINES TERMINATED BY '\n'; 
Query OK, 1 row affected (0.00 sec) 

mysql> 
[1]+ Stopped     mysql 
[[email protected] ~]# cat /tmp/test.csv 
cat: /tmp/test.csv: No such file or directory 

我应该在失败的情况下看到MySQL的不同输出吗?

我可以比“1行受影响”进一步验证结果吗?

+0

为什么select语句会影响任何东西? – futureelite7 2009-06-24 12:55:29

+0

推测它是指outfile函数而不是select。 – Andy 2009-06-24 12:56:26

回答

17

由outfile子句生成的文件在mysql服务器主机上创建。请确保你正在查看MySQL服务器主机,因为它似乎是在客户端主机上,而这很可能不是mysql服务器主机。

请参阅http://dev.mysql.com/doc/refman/5.0/en/select.html关于outfile的章节以获取有关此文档的信息。

+0

谢谢Dipin,你是对的,这不是数据库服务器。非常感谢 – Andy 2009-06-25 10:02:04

0

听起来像你可能会遇到文件权限问题。确保mysqld正在运行的用户组具有足够的权限写入/tmp/test.csv

有很多服务器守护进程/文件权限风格可以解决问题。大概是基于UNIX的,你可以:chgrp命令mysqldGROUP/tmp目录

但是,这使得它显得如此了解快速您的服务器以某种方式配置,让你适应这一点。 mysqld进程应该只能从少数几个地方读/写。

10

我碰到这个问题了Fedora 17来了,它是由systemd引起的。我认为这是很好的分享。

mysql> select * into outfile '/tmp/z1' from t1; 
Query OK, 673 rows affected (0.01 sec) 
mysql> select * into outfile '/tmp/z2' from t1; 
Query OK, 673 rows affected (0.01 sec) 
mysql> select * into outfile '/tmp/z1' from t1; 
ERROR 1086 (HY000): File '/tmp/z1' already exists 
mysql> Bye 

# cat /tmp/z1 
cat: /tmp/z1: No such file or directory 
# ls -d systemd-* 
/tmp/systemd-private-AQEueG 
/tmp/systemd-private-AuCNDY 
/tmp/systemd-private-TOMNxZ 
/tmp/systemd-private-UacrpE 
/tmp/systemd-private-yal7lQ 
/tmp/systemd-private-ZlRJeN 
# ls /tmp/systemd-private-TOMNxZ 
z1 z2 

罪魁祸首是在/usr/lib/systemd/system/mysqld.service中。

# Place temp files in a secure directory, not /tmp 
PrivateTmp=true 

感谢this blog,我找到了线索。