0

我在 unix 服务器上管理多个数据库,并使用mysqldump. 由于(其中一些)这些数据库非常大(20+Gb),我通常使用bzip2, 压缩备份的 .sql 文件以获取压缩的 bz2 文件。

作为备份过程的一部分,我检查新备份文件的大小是否大于或等于先前备份文件的大小——我们每天都向这些数据库添加数据,但很少从这些数据库中删除数据数据库。

对备份文件大小的检查是对备份质量的检查 - 鉴于我们的数据库主要只是在大小上增长,如果新备份小于旧备份,则意味着 a) 某些内容已从数据库中删除(在这种情况下,我应该检查一下...)或 b)备份出了问题(在这种情况下,我应该检查一下原因...)。

但是,如果我比较 bz2 文件的大小 - 例如,使用比较(使用test) of stat %s,即使数据库的大小增加了,bz2 文件也可能缩小了 - 大概是因为更有效的压缩。

那么 - 我如何比较备份文件的大小?

  • 一种选择是将之前的备份文件从 .bz2 解压缩为 .sql,然后比较这些 .sql 文件的大小。但是,鉴于这些文件非常大(20+Gb),压缩/解压缩可能需要一段时间......
  • 另一种选择是将以前的备份文件保留为 .sql,然后再次比较 .sql 文件。这是我的首选选项,但需要注意确保我们最终不会出现大量 .sql 文件 - 因为这会很快耗尽我们的硬盘驱动器。

或者,SO 社区中的某个人可能有更好或更聪明的想法......?

4

1 回答 1

0

可以将输入文件分成几部分(例如 100MB 块)并分别进行比较。由于即使输入不同,大小实际上也可能保持不变,因此您通常不应使用它来查找差异 - 而是使用 cmp 之类的东西来查看文件是否不同。

也可以将各个部分的 bz2 文件组合在一起,并获得一个完全有效的多流 bz2 文件,该文件可以再次整体解压缩而没有任何问题。您可能想查看 pbzip,它是 bzip 的并行实现,并使用这种机制将并行 bzip 并行化到多流 bz2 文件中,以加快 smp/多核系统上的进程。

至于为什么我建议将文件分成几部分:根据您的 mysql 设置,您的某些部分可能永远不会改变,并且数据实际上可能大部分会在最后附加 - 如果您可以确保这一点,您只需要比较整个转储的一小部分,这将加快进程。

不过,请注意,整个数据可能会在不添加或删除任何内容的情况下发生变化,因为 mysql 可能会在内存中使用数据(例如,OPTIMIZE 命令可能会导致这种情况)

如果您使用 InnoDB,则可以使用另一种拆分数据的方法 - 在这种情况下,您可以告诉 mysql(使用 my.cnf)每个表使用一个文件,因此您可以 a)单独 bzip 这些文件并仅比较可能的表实际上已经更改(如果您在某些表中有静态数据)和/或 b)保存表文件的最后修改日期,并事先比较(同样,这仅在您的表只有静态数据)

于 2013-09-11T19:34:33.197 回答