我正在尝试将数据库表移动到另一台服务器;复杂的是当前运行该表的机器几乎没有剩余空间;所以我正在寻找一个可以通过网络工作的解决方案。
我尝试过从 src 机器上 mysqldumping 数据库并将其通过管道传输到目标 mysql 中;但我的数据库有 48m 行,即使关闭 auto_commit 并将 trx_commit cmd 设置为 2;我有一些狗缓慢的时间。
mysqldump -uuser -ppass --opt dbname dbtable | mysql -h remove.server -uuser -pass dbname
然后我尝试一次 mysqldump 一百万行; scp 将它们发送到目标机器并执行 mysql
我做了一些阅读,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 转储到标准输出。从我读到的来看,这似乎不可能。我能想到的唯一方法是创建一个 FIFO 并指向 mysql 在那里转储 - 然后编写一个脚本,同时读取 FIFO 并将其发送到目标服务器。但不太确定如何同步到其他服务器的语法;这让我想到了下一个问题。
假设我可以让 mysql 将 CSV 转储到标准输出而不是文件;然后我如何将该输出传送到目标服务器?如果我可以简单地在目标服务器上获取单个 csv 文件,我会很高兴,因为它有更多空间;因为这样我就可以简单地从文件中使用 mysqlimport 。
这让我想到了下一点......我很乐意能够做到这一点:
mysqldump -uuser -ppass --opt dbname --tab /dev/stdout dbtable | mysqlimport -h remove.server -uuser -pass dbname
但看起来 mysqlimport 不支持管道传输;你必须向它传递一个文件。
打字时突然想到;
是否可以使用上面列出的 FIFO 方法?然后让 mysqlimport 从 FIFO 读取并插入到目标服务器?我想唯一的问题是 mysql 转储的速度比导入到目标服务器的速度快;随后填充 src 服务器。
我对如何将 mysql CSV 转储到标准输出并将其通过网络传输到目标服务器(最好同时导入,但很高兴将其转储为目标上的文件)有点迷失。
任何帮助将不胜感激!
干杯,
本
UPDATE:我正在使用 innodb 表;我无法关闭 src 盒子超过 10 分钟。
UPDATE:我现在使用 sshfs 将目标上的目录安装到 src 上,并让 mysql 将 csv 转储到该文件夹中 - 似乎工作得很好。然后只需使用 mysqlimport 将其加载到目标数据库中即可。
UPDATE:所以现在我已经设法将数据放入目标框中 - 导入仍然像使用插入完成一样慢。 12 小时内导入了 900 万行。这里有些不对劲。有任何想法吗?
UPDATE:对于那些感兴趣的人...这也不起作用:http://forums.mysql.com/read.php?22,154964 http://forums.mysql.com/read.php?22,154964