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

时间:2011-02-16 11:46:38

标签: mysql mysqldump large-data-volumes mysqlimport sshfs

我正在尝试将数据库表移动到另一台服务器;复杂的是目前运行表的机器几乎没有空间;所以我正在寻找一种可以在网上工作的解决方案。

我已经尝试过从src机器中获取mysqldumping数据库并将其传输到dest中的mysql;但我的数据库有48米行,甚至在关闭auto_commit时也是如此。 trx_commit cmd为2;我的狗吃得很慢。

mysqldump -uuser -ppass --opt dbname dbtable  | mysql -h remove.server  -uuser -pass dbname

然后我尝试mysqldump一次一百万行; scp他们到dest机器并做一个mysql< file.sql但这似乎变得越来越慢。我达到了第7行(7,000,000)行;接下来的百万进口需要240分钟。

我做了一些阅读,mysql建议使用CSV LOAD IN FILE样式导入比插入快约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表;我不能在超过10分钟的时间内关闭src框。


更新:我现在正在使用sshfs将目录上的dir挂载到src并让mysql将csv转储到该文件夹​​中 - 似乎工作正常。然后只需使用mysqlimport将其加载到dest的数据库中。


UPDATE:所以现在我已经设法将数据传输到dest框 - 导入仍然像使用INSERTS一样慢。 12小时内导入9米行。有点不对劲。有什么想法吗?


更新:对于有兴趣的人......这也不起作用:http://forums.mysql.com/read.php?22,154964

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

原来问题在于我插入的主机。没有足够的RAM +慢机器导致查询备份。