2010-05-19 129 views
31

MySQL非常棒!我目前正在参与主要的服务器迁移,之前,我们的小型数据库曾经与客户端托管在同一台服务器上。
所以我们用来做这样的:SELECT * INTO OUTFILE .... LOAD DATA INFILE ....MySQL - SELECT * INTO OUTFILE LOCAL?

现在,我们移动数据库到不同的服务器和SELECT * INTO OUTFILE ....不再起作用,可以理解的 - 安全方面的原因,我相信。 但有趣的是LOAD DATA INFILE ....可以更改为LOAD DATA LOCAL INFILE ....和巴姆,它的工作原理。

我不是抱怨,也不是对MySQL表示厌恶。替代方案增加了2行额外代码和一个系统调用,形成一个.sql脚本。我想知道的是为什么LOAD DATA LOCAL INFILE工作,为什么没有这样的事情SELECT INTO OUTFILE LOCAL

我做了功课,找不到直接回答我上面的问题。我无法找到一个功能请求@ MySQL。如果有人能够清除这个,那真是太棒了!

MariaDB是否能够处理这个问题?

+0

有涉及使用tee命令,允许您登录输入和mysql的输出到一个替代单独的文件在客户端,但是这会记录整个mysql会话,而不是输出选择查询内容,并且没有格式化选项,如输出为CSV样式。 – CMCDragonkai 2017-07-27 02:15:51

回答

43

从手册:The SELECT ... INTO OUTFILE声明主要是为了让您快速转储表到服务器机器上的文本文件。如果要在除服务器主机之外的某个客户端主机上创建生成的文件,则不能使用SELECT ... INTO OUTFILE。在这种情况下,你应该使用这样的命令为mysql -e "SELECT ..." > file_name生成客户端主机上的文件“

http://dev.mysql.com/doc/refman/5.0/en/select.html

一个例子:

mysql -h my.db.com -u usrname--password=pass db_name -e 'SELECT foo FROM bar' > /tmp/myfile.txt 
2

回复:SELECT * INTO OUTFILE

检查MySQL有权限将文件写入到服务器上的目录OUTFILE。

+0

OUTFILE将写入与数据库托管的服务器不同的客户端服务器。 – ThinkCode 2010-05-19 17:22:31

+3

MySQL文档(http://dev.mysql.com/doc/refman/5.0/en/select.html)定义了OUTFILE的位置。它指出: “该文件是在服务器主机上创建的,因此您必须具有FILE权限才能使用此语法。file_name不能是现有文件,除其他外可防止诸如/ etc/passwd和数据库表之类的文件存在销毁。“ 因此,我会检查MySQL是否有权将文件写入服务器上的OUTFILE目录。我不知道为什么没有“LOCAL OUTFILE”版本。如果你需要在本地导出一个选项,很多人使用的是phpMyAdmin。 – Snowcrash 2010-06-02 06:59:02

+0

你刚给我留了一个不明确的帖子。 – octopusgrabbus 2015-03-05 15:16:44

5

您给LOAD DATA INFILE的路径是用于运行服务器的机器上的文件系统,而不是您连接的机器。 LOAD DATA LOCAL INFILE适用于客户机器,但它要求服务器以正确的设置启动,否则不允许。你可以在这里阅读所有关于它:http://dev.mysql.com/doc/refman/5.0/en/load-data-local.html

至于SELECT INTO OUTFILE我不知道为什么没有本地版本,除了它可能是棘手做主持的连接。您可以通过mysqldump工具获得相同的功能,但不能通过将SQL发送到服务器。

+1

LOAD DATA正常工作,但尽可能在托管数据库的服务器上转储文件,但无法将文件转储到位于不同服务器上的客户端。 – ThinkCode 2010-05-19 17:23:33

+1

mysqldump和mysql -e swtich选项都达不到预期的结果。 mysqldump转储整个数据库/表,并且我们不能只转储基于条件的几列。 mysql -e swtich将文件转储为.txt格式,并且无法实现管道输出。 – ThinkCode 2010-05-19 17:45:01

5

你可以达到你想要的是什么mysql控制台传入-s(--silent)选项。

传递-r(--raw)选项以避免特殊字符被转义可能是个好主意。这对管道查询像你wanti NG。

的mysql -u用户名-h主机名-p -s -r -e“选择CONCAT( '本',””, '工作')”

编辑:另外,如果你想删除列(mysql -ss -r等)

2

在Waverly360中使用带-e选项的mysql CLI是个不错的选择,但那可能会导致内存不足,并在大型结果。(没有找到它背后的原因)。 如果是这样的话,你需要的所有记录,我的解决办法是:mysqldump的+ mysqldump2csv:

wget https://raw.githubusercontent.com/jamesmishra/mysqldump-to-csv/master/mysqldump_to_csv.py 
mysqldump -u username -p --host=hostname database table | python mysqldump_to_csv.py > table.csv 
相关问题