0

我正在尝试使用 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,性能仍然很糟糕。

4

4 回答 4

1

rsync 仍然需要计算块哈希以确定发生了什么变化。可能不修改的情况是查看文件修改时间/大小的快捷方式。

于 2009-07-31T18:27:10.100 回答
0

在进行本地复制时, rsync 默认--whole-file为有一个原因:它比进行检查要快。

  • 如果您想要最快的本地副本,那么您已经得到了。
  • 如果您想查看 rsync 加速,请通过网络复制。它令人印象深刻,但不会比本地完整副本快。

cp当您有一个只有一些文件更改的大目录时,本地副本的 rsync 是一个很好的替代品。它将整个复制这些文件;但快速跳过那些未修改的(仅检查时间戳和文件大小)。对于单个大文件,它并不比cp.

于 2009-10-07T17:13:01.600 回答
0

rsync 使用一种算法来查看文件是否已更改,然后查看文件的哪些部分已更改。在大型数据库中,您的更改通常分布在文件的很大一部分中。这是 rsync 最坏的情况。

于 2009-07-31T18:28:54.260 回答
0

Rsync 是基于文件的。如果您找到了一种使用基于块的系统的方法,那么您可以备份已更改的块/字节。

LVM 快照可能是执行此操作的一种方式。

于 2009-10-07T17:04:12.007 回答