首页 > 解决方案 > 将 10GB 的 mysql 表发送到远程服务器

问题描述

我正在尝试将大型 myisam 表(10GB)导出到远程服务器:

zcat mytable.sql.gz | mysql --host=xx --user=xx --port=xx --password=xx dw

由于远程服务器配置(我无法更改)和 RAM,发送 gzip mysqldump 系统性地失败。

我试图用每行一个插入来构建一个转储:

mysqldump db_name --extended-insert=FALSE --no-create-info=TRUE | gzip > mytable.sql.gz

并将其拆分为 200M 块:

split -C 200M --numeric-suffixes mytable.sql.gz /dumps/mytable_part    

但是发送这些 200M 块中的一个需要 20 多分钟,因此发送整个表对于定期备份来说太慢了。我猜每行插入一个非常慢。

一种解决方案可能是进行多个插入转储,但使用分组插入,如 INSERT INTO (field) VALUES (1), (2), ... 但我不确定这是否可能。

有没有我没有想到的解决方法?

标签: mysqlbash

解决方案


mysqldump \
  --extended-insert=FALSE \
  --no-create-info=TRUE \
  db_name \
| ssh \
    username@remote-host.example.com \
    mysql \
      --user=xx \
      --password=xx \
      dw

这个怎么运作:

mysqldump --extended-insert=FALSE --no-create-info=TRUE db_name 创建 的 MySQL 转储db_name并将数据流式传输到stdio输出中。

| ssh username@remote-host.example.comstdio将流通过 管道传输到ssh与远程主机的连接中

mysql --user=xx --password=xx dw 是连接mysql在远程主机上执行的命令ssh。它读取stdio通过ssh连接传输并来自 MySQL 转储的流。该转储在本地生成,通过远程主机传输ssh并导入到 dw 数据库中。

这种方法比任何有能力的管理员都拒绝将 MySQL 协议开放到广泛的 Internet 更安全和紧凑。

这可能就是您第一次尝试使用mysql直接寻址远程主机的命令不起作用的原因。远程主机 MySQL 数据库服务器未侦听或接受远程连接,或者至少不是来自广泛的 Internet。

使用ssh以下命令可以安全地传输转储数据,同时让远程主机的 MySQL 服务器仅处理来自mysql命令的本地连接。


推荐阅读