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