MySQL 没有临时文件的远程主机的数据库转储

MySQL database dump from remote host without temporary file

我正在尝试在我的工作中实施数据库备份 cron(欢迎使用其他解决方案),但我遇到了一个小问题:

我在 space 中有一个超过 10GB 的大型数据库,而当前的虚拟机没有 space 可以将其存储在 mysql 创建的临时文件中。

我知道我可以使用带有主机参数的 mysqldump,但我的问题是,这样做时 mysqldump 生成的临时文件是否留在 [=24] 的机器上=] 它还是保留在数据库服务器上?

更新: 我忘了说我正在尝试备份一个网站网络,其中一些在防火墙后面(需要 VPN 访问),一些需要跳服务器才能访问数据库服务器。

您可以 运行 来自存档主机的 shell 脚本,您已经在其中与数据库服务器交换了无密码 ssh 密钥。这使您可以直接通过 ssh 传输文件,而无需在远程数据库服务器上创建任何临时文件:

ssh -C myhost.com mysqldump -u my_user --password=bigsecret \ 
  --skip-lock-tables --opt database_name > local_backup_file.sql

显然有一些方法可以在命令行上保护该密码,但这种方法可以完成您想要的。这种方法的一个优点是它不需要存档主机可以访问远程主机上的端口 3306。

This guy's version 很酷,因为它还在通过网络传输数据之前即时压缩数据,然后在将数据加载到本地数据库之前解压缩。

ssh me@remoteserver 'mysqldump -u user -psecret production_database | \
  gzip -9' | gzip -d | mysql local_database

但这就是我的版本使用 ssh -C 的原因,它启用了自己的压缩算法并避免了额外的 gzip 管道。

根据具体情况,使用 MySQL 复制可能是更好的主意。在备份服务器上设置 MySQL 并将其配置为生产数据库的从属服务器(参见 http://dev.mysql.com/doc/refman/5.7/en/replication-howto.html)。然后您可以轻松转储从数据库。

这种方法的一个优点是您不会在每次要备份时传输 10GB,您只是在发生任何更改时将其传输到数据库。

尽管如此,您需要密切关注复制,因为如果它失败,您的从属数据库将变得陈旧。