rsync 和 MyISAM 表
我正在尝试使用 rsync 来备份 MySQL 数据。 这些表使用 MyISAM 存储引擎。
我的期望是,在第一次 rsync 之后,后续的 rsync 会非常快。 事实证明,如果表数据发生了根本改变,操作就会变慢。
我用包含真实数据的 989 MB MYD 文件做了一个实验:
测试 1 - 重新复制未修改的数据
rsync -a orig.MYD copy.MYD
- 如预期需要一段时间
rsync -a orig.MYD copy.MYD
- 瞬时 - 加速数以百万计
计测试 2 - 重新复制稍微修改过的数据
rsync -a orig.MYD copy.MYD
- 如预期需要一段时间
UPDATE table SET counter = counter + 1 WHERE id = 12345
rsync -a orig.MYD copy.MYD
- 与原始副本一样长!
是什么赋予了? 为什么 rsync 仅仅复制一个微小的更改就需要很长时间?
编辑:事实上,测试 2 中的第二次 rsync 花费的时间与第一次一样长。 rsync 显然正在再次复制整个文件。
编辑:事实证明,从本地复制到本地时,隐含了 --whole-file 。 即使使用 --no-whole-file,性能仍然很糟糕。
I'm trying to use rsync to backup MySQL data. The tables use the MyISAM storage engine.
My expectation was that after the first rsync, subsequent rsyncs would be very fast. It turns out, if the table data was changed at all, the operation slows way down.
I did an experiment with a 989 MB MYD file containing real data:
Test 1 - recopying unmodified data
rsync -a orig.MYD copy.MYD
- takes a while as expected
rsync -a orig.MYD copy.MYD
- instantaneous - speedup is in the millions
Test 2 - recopying slightly modified data
rsync -a orig.MYD copy.MYD
- takes a while as expected
UPDATE table SET counter = counter + 1 WHERE id = 12345
rsync -a orig.MYD copy.MYD
- takes as long as the original copy!
What gives? Why is rsync taking forever just to copy a tiny change?
Edit: In fact, the second rsync in Test 2 takes as long as the first. rsync is apparently copying the whole file again.
Edit: Turns out when copying from local to local, --whole-file is implied. Even with --no-whole-file, the performance is still terrible.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
rsync 仍然需要计算块哈希来确定发生了什么变化。 不修改的情况可能是查看文件修改时间/大小的快捷方式。
rsync still has to calculate block hashes to determine what's changed. It may be that the no-modification case is a shortcut looking at file mod time / size.
rsync 使用一种算法来查看文件是否已更改,然后查看文件的哪些部分发生了更改。 在大型数据库中,您的更改通常会分布在文件的很大一部分中。 这是 rsync 最坏的情况。
rsync uses an algorithim where it sees if a file has changed, and then sees what parts of it changed. In a large database it is common that your changes are spread throughout a large segment of the file. This is rsync's worst case scenario.
Rsync 是基于文件的。 如果您找到了一种使用基于块的系统执行此操作的方法,那么您可以只备份已更改的块/字节。
LVM 快照可能是实现此目的的一种方法。
Rsync is file based. If you found a way of doing it with a block based system then you could just backup the blocks/bytes that had changed.
LVM snapshots might be one way of doing this.
在进行本地复制时,rsync 默认为
--whole-file
,原因是:它比执行检查更快。当您有一个只有部分文件发生变化的大目录时,本地副本的 rsync 是 cp 的一个很好的替代品。 它将整个复制这些文件; 但快速跳过那些未修改的(仅检查时间戳和文件大小)。 对于单个大文件来说,它并不比
cp
更好。when doing local copies, rsync defaults to
--whole-file
for a reason: it's faster than doing the checks.rsync for local copies is a nice replacement to
cp
when you have a big directory where only some files change. It'll copy those file whole; but quickly skip those not modified (just checking timestamps and filesize). For a single big file, it's no better thancp
.