最近,我从 切换到zip
来bz2
压缩夜间数据库转储。我使用的命令是tar cj
。旧zip
文件的大小每天都会略有不同:
-rw-r--r-- 1 mysql mysql 1192139 Aug 20 22:00 mysql_full_export.Fri.zip
-rw-r--r-- 1 mysql mysql 1192425 Aug 23 22:00 mysql_full_export.Mon.zip
-rw-r--r-- 1 mysql mysql 1192140 Aug 21 22:00 mysql_full_export.Sat.zip
-rw-r--r-- 1 mysql mysql 1192145 Aug 22 22:00 mysql_full_export.Sun.zip
-rw-r--r-- 1 mysql mysql 1192137 Aug 19 22:00 mysql_full_export.Thu.zip
-rw-r--r-- 1 mysql mysql 1192403 Aug 24 22:00 mysql_full_export.Tue.zip
-rw-r--r-- 1 mysql mysql 1186645 Aug 25 22:00 mysql_full_export.Wed.zip
而新bz2
文件的大小与上周相同:
-rw-r--r-- 1 mysql mysql 972800 Oct 1 22:00 mysql_full_export.Fri.bz2
-rw-r--r-- 1 mysql mysql 972800 Oct 4 22:00 mysql_full_export.Mon.bz2
-rw-r--r-- 1 mysql mysql 972800 Oct 2 22:00 mysql_full_export.Sat.bz2
-rw-r--r-- 1 mysql mysql 972800 Oct 3 22:00 mysql_full_export.Sun.bz2
-rw-r--r-- 1 mysql mysql 972800 Oct 7 22:00 mysql_full_export.Thu.bz2
-rw-r--r-- 1 mysql mysql 972800 Oct 5 22:00 mysql_full_export.Tue.bz2
-rw-r--r-- 1 mysql mysql 972800 Oct 6 22:00 mysql_full_export.Wed.bz2
如果压缩文件的大小仅略有不同,这正常吗bz2
?这个数据库几乎没有变化,但从文件大小可以看出它确实有一点变化zip
。
跟进:
下面标记为正确的答案似乎是最好的解释。计算 md5 校验和的建议也很有帮助,因为它证实了文件确实不同:
$ md5sum *.bz2
7bec25e80644645e6b2d5b417bb4627d mysql_full_export.Fri.bz2
9cca30e7ed4fb536976ef9d8705e0466 mysql_full_export.Mon.bz2
bc9b9cd1e5a5e552811bff80192b1b43 mysql_full_export.Sat.bz2
7ebbed98f7153a6cafe61836d9a6440d mysql_full_export.Sun.bz2
ad1af98a0ecf90bef1dc1c0b3dedb101 mysql_full_export.Thu.bz2
b399d30e03c200c1ad03bde391e5e682 mysql_full_export.Tue.bz2
b14b4d1bb22ef39b9ebc2f668a2f520d mysql_full_export.Wed.bz2
答案1
另一个想法是 tar 文件格式始终在 512 字节边界上对齐,NUL
如果它更短(每个文件),它会用字符填充它。
现在,tar 应该在 bz2 之前完成,因此它的大小应该仍然会有所不同(理论上)。但也许它先压缩,然后将其放入 tar 中,导致它与 512 字节边界对齐?
答案2
也许脚本存档中有一个错误。比较文件:
cmp mysql_full_export.Wed.bz2 mysql_full_export.Tue.bz2
比较档案的内容(使用 diff 或 cmp)。
答案3
在包含 bz2 文件的目录中粘贴此命令:
for file in *.bz2;do echo "checksum for ${file/.bz2/}: $(bunzip2 -c $file|md5sum)";done
如果所有的校验和都不同,那么未压缩的文件也是不同的。