我在unix服务器上管理多个数据库,并使用mysqldump
对这些数据库进行每日备份。由于(某些)这些数据库非常大(20 + Gb),我通常使用bzip2
压缩备份.sql文件,以获取压缩的bz2文件。
作为备份过程的一部分,我检查新备份文件的大小是否大于或等于上一个备份文件的大小 - 我们每天都会向这些数据库添加数据,但很少会删除这些数据库中的数据。
检查备份文件大小是对备份质量的检查 - 假设我们的数据库主要只是增大,如果新备份小于旧备份,则意味着a)已删除某些内容从数据库(在这种情况下,我应该检查...)或b)备份出错(在这种情况下,我应该检查为什么......)。
但是,如果我比较bz2文件的大小 - 例如,使用test
的比较(使用stat %s
),即使数据库的大小增加,bz2文件也可能缩小 - 可能是因为更有效的压缩。
那么 - 如何比较备份文件的大小?
或者,SO社区中的某个人可能有更好或更明智的想法......?
答案 0 :(得分:0)
可以将输入文件拆分为多个部分(例如100MB块)并单独进行比较。由于即使使用不同的输入,大小实际上也可能保持不变,您通常不应该使用它来查找差异 - 而是使用类似cmp的内容来查看文件是否不同。
也可以将各个部分的bz2文件放在一起,得到一个完全有效的多流bz2文件,可以在没有任何问题的情况下再次解压缩。您可能希望研究pbzip,它是bzip的并行实现,并使用这个并行bzip的机制进入多流bz2文件,以加速smp /多核系统上的进程。
至于为什么我建议将文件分成几部分:根据你的mysql设置,你的某些部分可能永远不会改变,而数据实际上可能最终会附加到最后 - 如果你能确定这样,你只需要比较整个转储的小部分,这将加快这个过程。
但是,请注意,整个数据可能会在没有添加或删除任何内容的情况下发生变化,因为mysql可能会在内存中占用数据(例如OPTIMIZE命令可能会导致这种情况)
如果您使用InnoDB,可以使用另一种分割数据的方法 - 在这种情况下,您可以告诉mysql(使用my.cnf)每个表使用一个文件,因此您可以a)单独bzip这些文件并仅比较实际上可能已更改的表(如果您在某些表中有静态数据)和/或b)保存表文件的上次修改日期,并事先进行比较(同样,这只有在您拥有的情况下才真正有用)仅包含静态数据的表格