我正在尝试将数据库表移动到另一台服务器;复杂的是目前运行表的机器几乎没有空间;所以我正在寻找一种可以在网上工作的解决方案。
我已经尝试过从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
答案 0 :(得分:1)
您需要mysqlhostcopy
支持scp
,当然服务器之间的物理距离会导致流量问题
答案 1 :(得分:1)
原来问题在于我插入的主机。没有足够的RAM +慢机器导致查询备份。