Mysqldump压缩

26

我想要理解mysqldump是如何工作的:

如果我在我的电脑上执行mysqldump并连接到一个远程服务器:

mysqldump -u mark -h 34.32.23.23 -pxxx  --quick | gzip > dump.sql.gz

服务器会将数据压缩成gzip格式后再发送给我吗?还是我的电脑会先接收到所有数据,然后再进行压缩?

因为我需要导出一个非常大的远程数据库,我想知道如何在网络上以最快的方式完成。


如果在您的PC上执行此行,则gzip也将在您的PC上运行。这意味着您将获得未压缩的原始转储。 - pritaeas
3个回答

40

你应该使用ssh + scp,因为本地主机上的转储速度更快,
并且你只需要将gzip文件进行scp传输(网络开销较小)。

很可能你可以这样做。

ssh $username@34.32.23.23 "mysqldump -u mark -h localhost -pxxx --quick | gzip > /tmp/dump.sql.gz"

scp $username@34.32.23.23:/tmp/dump.sql.gz .

(可选的 /tmp 目录,应更改为您习惯的任何目录)


好主意,问题是我正在处理Cleardb(这是Amazon RDS的商业实例),我无法通过SSH登录..不知道是否可能! - Mark Belli
是的,那就是下一步。但在一个(虚拟)共享数据库上,我不认为他们会让我这样做 :( - Mark Belli
你有 EC2 或任何靠近数据库服务器的其他服务器吗?如果有,就在那个服务器上运行命令,然后使用 scp 命令将文件传回你的个人电脑。否则,就忍受网络传输速度较慢吧... - ajreal
不幸的是没有EC2..但我可以购买一个按小时计费的实例来完成这个传输..感谢提示! - Mark Belli
我经常这样做,效果很好。顺便说一下:如果你正在移动一个已经备份过的表的更新转储(备份?),你可以使用 mysqldump | gzip --rsyncalbe 并将文件通过 rsync 同步到目标位置,而不是使用 scp。这样可以避免获取已经存在的位。 - MatrixManAtYrService

17

是的,它可以大大减少数据传输量!但我想了解的是:mysqldump 是在我的电脑上缓存数据还是在远程服务器上缓存数据。据我所知,它首先会将所有数据传输到我的电脑上。我的理解正确吗? - Mark Belli
2
关于 --compress 参数的工作原理,文档资料并不多。我可以做出一个有根据的猜测,但需要查看源代码才能确定。但是我认为你的问题是它是在服务器端还是客户端进行压缩。在你的示例中,它肯定是在客户端进行的。如果你已经看到了压缩参数减少了数据传输量,那么这应该回答了你的问题,即它是在服务器端进行压缩的。 - Mark Fraser

0

这是我的做法:

使用SELECT INTO OUTFILE进行部分导出,并在同一服务器上创建文件。

如果您的表包含1000万行,则每次以100万行的方式进行部分导出,每次在单独的文件中。

一旦第一个文件准备好,您可以压缩并传输它。同时,MySQL可以继续将数据导出到下一个文件中。

在另一个服务器上,您可以开始将文件加载到新数据库中。

顺便说一句,很多东西都可以脚本化。


Amazon RDS 不支持 OUTFILE。 - codewandler

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