在工作中,我们每晚都会转储 mysql 数据库。日复一日,我估计接近 90-95% 的数据是重复的,并且随着时间的推移而增加。 (哎呀,在这一点上有些可能是99%)
这些转储中的一行是单个 mysql INSERT 语句,因此唯一的区别是整行以及它们在文件中的顺序。如果我对它们进行排序,文件之间的实际差异将非常小。
我一直在寻找,但没有找到任何方法对转储上的输出进行排序。不过,我可以通过命令管道它sort
。然后就会有很长很长的相同线条块。
所以我试图找到一种只存储差异的方法。我可以从主转储开始,然后每天晚上进行比较。但每晚的差异都会更大。或者,我可以制作滚动差异,这些差异单独来看会非常小,但如果我必须每天晚上将整个系列的主差异放在一起,那么计算起来似乎会花费越来越长的时间。
这可行吗?用什么工具?
编辑我不是问如何做mysql备份。暂时忘记mysql。这是一条红鲱鱼。我想知道的是如何从一系列文件中制作一系列滚动差异。每天晚上我们都会收到一个文件(恰好是一个 mysqldump 文件)与之前的相似度为 99%。是的,我们将它们全部压缩。但一开始就有这么多冗余是多余的。我真正需要的是与前一天晚上的差异...与前一天晚上只有 1% 的差异...等等。所以我所追求的是如何进行一系列差异,这样我每晚只需要存储 1% 的数据。
答案1
答案2
最近我一直在尝试在 git 中存储数据库转储。如果您的数据库转储非常大,这可能会变得不切实际,但它对我来说适用于小型数据库(Wordpress 网站等)。
我的备份脚本大致是:
cd /where/I/keep/backups && \
mysqldump > backup.sql && \
git commit -q -m "db dump `date '+%F-%T'`" backup.sql
答案3
你可以做这样的事情(作为a.sql
你的每周备份)。
mysqldump > b.sql
diff a.sql b.sql > a1.diff
scp a1.diff backupserver:~/backup/
到本周末,您的差异文件将会变得更大。
我的建议是 gzip 它(用于gzip -9
最大压缩)。我们目前这样做,使用 59MB 的 gz 文件,而原始文件为 639MB。
答案4
(我还没有在生产中这样做。)
每天或每周进行一次完整备份。每小时或每天备份一次中继日志。