将mysql表转储到CSV(stdout),然后通过隧道将输出传输到另一台服务器

将mysql表转储到CSV(stdout),然后通过隧道将输出传输到另一台服务器,mysql,mysqldump,large-data-volumes,mysqlimport,sshfs,Mysql,Mysqldump,Large Data Volumes,Mysqlimport,Sshfs,我试图将数据库表移动到另一台服务器;复杂的是,当前运行工作台的机器几乎没有剩余空间;因此,我正在寻找一种可以在网络上工作的解决方案 我尝试过mysql从src机器中转储数据库,并在dest将其传输到mysql中;但我的数据库有4800万行,甚至在关闭auto_commit时&trx_commit cmd为2;我的狗跑得很慢 mysqldump -uuser -ppass --opt dbname dbtable | mysql -h remove.server -uuser -pass db

我试图将数据库表移动到另一台服务器;复杂的是,当前运行工作台的机器几乎没有剩余空间;因此,我正在寻找一种可以在网络上工作的解决方案

我尝试过mysql从src机器中转储数据库,并在dest将其传输到mysql中;但我的数据库有4800万行,甚至在关闭auto_commit时&trx_commit cmd为2;我的狗跑得很慢

mysqldump -uuser -ppass --opt dbname dbtable  | mysql -h remove.server  -uuser -pass dbname
然后我试着一次倒一百万行;将它们放到dest机器上,并执行mysql 我做了一些阅读,mysql建议在文件样式导入中使用CSV加载比插入快约20倍。所以现在我被卡住了

我可以使用标准sql语法了解如何导出为CSV:

SELECT *
INTO OUTFILE '/tmp/tmpfile'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
FROM table;
但这显然不起作用,因为它会很快占用我已经很低的磁盘空间。所以我想找一个开关,让mysqldump将csv转储到stdout。从我所读到的来看,这似乎是不可能的。我能想到的唯一方法是创建一个FIFO并将mysql指向转储,然后编写一个脚本,同时读取FIFO并将其发送到dest服务器。但不确定如何同步到其他服务器的语法;这就引出了我的下一个问题

假设我可以让mysql将CSV转储到stdout,而不是一个文件;然后如何将该输出通过管道传输到dest服务器?我很高兴如果我能在dest服务器上得到一个csv文件,因为它有更多的空间;因为这样我就可以从文件中简单地使用mysqlimport了

这就引出了我的下一点。。。我希望能够做到这一点:

mysqldump -uuser -ppass --opt dbname --tab /dev/stdout dbtable  | mysqlimport -h remove.server  -uuser -pass dbname 
但是看起来mysqlimport不支持管道到它;你必须给它传递一个文件

只是在打字的时候想了想

是否可以使用上述FIFO方法;然后让mysqlimport从FIFO读取并插入dest服务器?我想唯一的问题是mysql的转储速度比它导入dest服务器的速度要快;随后填充src服务器

我对如何将mysql CSV转储到stdout并通过网络将其传输到dest服务器(最好同时导入,但很乐意将其作为文件转储到dest上)有点迷茫

任何帮助都将不胜感激

干杯, 本


更新:我正在使用innodb表;我不能关闭src盒超过10分钟


更新:我现在正在使用sshfs将dest上的dir挂载到src上,并让mysql将csv转储到该文件夹中,这似乎非常有效。然后,只需使用mysqlimport将其加载到dest的数据库中即可


更新:因此,现在我已经成功地将数据放到dest框中-导入仍然很慢,就好像是通过插入完成的一样。12小时内进口900万行。这里有些不对劲。有什么想法吗



更新:对于感兴趣的人。。。这也不起作用:

您需要哪种支持
scp
,当然,服务器之间的物理距离正在导致流量问题

原来问题出在我插入的主机上。RAM不足+机器速度慢导致查询备份。

好的,所以我无法写入FIFO,因为mysql抱怨文件已经存在。>>我现在使用sshfs将dest上的dir挂载到src上,并让mysql将csv转储到该文件夹中-似乎工作得很好。#你能解释一下你是如何做到这一点的吗?@shantanuo基本上在你的
src
服务器上,你可以使用以下命令设置一个到
dest
服务器的隧道:
sudo-u mysql sshfsuser@dest:/tmp/mysqlcsv/tmp/csvout
。基本上就是说,将位于
dest
上的文件夹
/tmp/mysqlcsv
装载到位于
/tmp/csvout
的本地文件夹。然后告诉mysql将csv文件转储到
/tmp/csvout
文件夹中,如下所示:@shantanuo oops sorry。。您告诉sql将以下字段转储到那里:
SELECT*到OUTFILE'/tmp/csvout'字段中,这些字段以“,”结尾“'由表中以'\n'结尾的'\\'行转义
内容将神奇地出现在
dest
@shantanuo上的
/tmp/mysqlcsv
文件夹中对不起,
选择
行应该是:
选择*进入OUTFILE'/tmp/csvout/table_name.txt'啊对不起;我应该提到我正在使用innodb表。