远程主机的MySQL数据库转储,无需临时文件

7
我正在尝试在工作中实现数据库备份的定时任务(欢迎使用其他解决方案),但我有一个小问题:
我有一个超过10GB的大型数据库,当前虚拟机没有足够的空间来存储mysql创建的临时文件。
我知道可以使用带有主机参数的mysqldump,但我的问题是,当这样做时,mysqldump生成的临时文件会留在运行它的机器上还是留在数据库服务器上?
更新: 我忘了提到我正在尝试备份一组网站,并且其中一些在防火墙后面(需要VPN访问),一些需要服务器跳跃才能到达数据库服务器。

我99%确定文件在运行mysqldump进程的服务器上,而不是MySQL服务器所在的服务器上。这正是我在需要转储大型数据库且相关服务器没有足够磁盘空间时使用的过程。 - Eborbob
@Eborbob,你在归档机器上运行mysqldump了吗? - wadge
是的,类似于 mysqldump -h livedb.example.com -u user -p password > dump.sql 这样的东西。 - Eborbob
嗯,这意味着您可以直接访问MySQL的端口,在我们当前的设置中不是这种情况,所以我可能需要走下面提到的SSH路线。 - wadge
如果这是一个永久性的设置而不仅仅是一次性备份,最简单的方法可能是在两个服务器之间建立VPN。 - Eborbob
2个回答

5
您可以从存档主机上运行shell脚本,前提是您已经使用无密码ssh密钥与数据库服务器进行了交换。这使您可以通过ssh直接传输文件,而无需在远程数据库服务器上创建任何临时文件:
ssh -C myhost.com mysqldump -u my_user --password=bigsecret \ 
  --skip-lock-tables --opt database_name > local_backup_file.sql

显然,有一些方法可以在命令行上保护密码,但这种方法可以实现你想要的目的。这种方法的一个优点是它不需要存档主机访问远程主机上的3306端口。
这个人的版本很酷,因为它在传输数据之前也压缩数据,然后在将其加载到本地数据库之前解压缩数据。 此处 为该版本链接。
ssh me@remoteserver 'mysqldump -u user -psecret production_database | \
  gzip -9' | gzip -d | mysql local_database

但这就是为什么我使用ssh -C,它可以启用自己的压缩算法,避免额外的gzip管道。

在我的情况下,我需要进行完整的数据库服务器备份(如果我没记错的话,可以使用mysqldump中的-A选项)。通过在远程机器上执行mysqldump,然后将结果返回(虽然是压缩的),这意味着临时文件位于远程主机上,对吗?我能否在归档服务器上使用mysqldump的-h选项? - wadge

0

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

这种方法的优点是每次备份时不需要传输10GB,仅在发生更改时传输数据库中的更改。

但是,您需要关注复制过程,因为如果失败,则从库数据库将变得陈旧。


让我困惑的是,我的网络由不同设置的站点组成(一些在防火墙后面,一些需要通过ssh隧道才能到达),我不知道单个复制服务器是否足够。(将此信息添加到主要问题中) - wadge
与其使用SSH隧道,我发现设置VPN更容易。这样,您可以使实时和归档机器显示在同一网络上,并且mysqldump命令将可以直接运行,而无需进行任何混乱的操作。 - Eborbob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接