比较unix中的bz2文件

时间:2012-10-22 09:31:48

标签: unix comparison database-backups stat bzip2

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

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

检查备份文件大小是对备份质量的检查 - 假设我们的数据库主要只是增大,如果新备份小于旧备份,则意味着a)已删除某些内容从数据库(在这种情况下,我应该检查...)或b)备份出错(在这种情况下,我应该检查为什么......)。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

可以将输入文件拆分为多个部分(例如100MB块)并单独进行比较。由于即使使用不同的输入,大小实际上也可能保持不变,您通常不应该使用它来查找差异 - 而是使用类似cmp的内容来查看文件是否不同。

也可以将各个部分的bz2文件放在一起,得到一个完全有效的多流bz2文件,可以在没有任何问题的情况下再次解压缩。您可能希望研究pbzip,它是bzip的并行实现,并使用这个并行bzip的机制进入多流bz2文件,以加速smp /多核系统上的进程。

至于为什么我建议将文件分成几部分:根据你的mysql设置,你的某些部分可能永远不会改变,而数据实际上可能最终会附加到最后 - 如果你能确定这样,你只需要比较整个转储的小部分,这将加快这个过程。

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

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