滚动差异来存储高度相似的文件?


18

在工作中,我们每晚进行mysql数据库转储。每天,我都会想像一下近90-95%的数据是重复的,并且随着时间的推移而增加。(在这一点上,大概是99%)

这些转储的一行仅是一条mysql INSERT语句,因此唯一的区别是整行以及它们在文件中的排列顺序。如果我将它们排序,则文件之间的实际差异将很小。

我一直在寻找,而且还没有找到对转储输出进行排序的任何方法。不过,我可以通过sort命令来传递它。然后将有很长很长的相同行的块。

因此,我试图找到一种仅存储差异的方法。我可以从一个主转储开始,然后每晚与之比较。但是差异每晚都会更大。或者,我可以制作滚动差异,每个差异非常小,但是如果我每晚必须整理整个系列的主要差异,似乎计算时间会越来越长。

这可行吗?用什么工具?


编辑我不问如何做mysql备份。暂时忘记mysql。这是一条红鲱鱼。我想知道的是如何从一系列文件中生成一系列滚动差异。每天晚上,我们都会收到一个文件(恰好是mysqldump文件),与之前的文件相似,为99%。是的,我们将它们全部压缩。但是将所有这些冗余放在首位是多余的。我真正需要的是与前一天晚上的区别……与前一天晚上的区别仅……1%,依此类推。因此,我要做的是如何进行一系列比较,以便每晚只存储1%。

Answers:


14

可以存储二进制差异的两个备份工具是rdiff-backupduplicity。两者均基于librsync,但除此之外,它们的行为也大不相同。Rdiff备份存储最新的复制和反向差异,而Duplicity存储传统的增量差异。这两个工具还提供了不同的外围功能集。


1
对于IIUC,rdiff-backup更具吸引力,因为它允许正常浏览备份,而重复则只有一个旧副本。
tshepang 2011年

我知道问题+问题已经很老了,但是您能添加一个示例示例来说明如何使用它吗?例如,backup201901.tar.gz,backup201902.tar.gz,...,backup201912.tar.gz,backup202001.tar.gz。这对于将来的参考很有用。
Basj

上次我跟随rdiff-backup时,主要开发人员已经前进,项目停滞了,不知道情况是否有所改变。如果那很重要的话,它在网络上的运行速度也令人难以置信。
Lizardx

13

最近,我一直在尝试在git中存储数据库转储。如果您的数据库转储很大,这可能不切实际,但是对于较小的数据库(Wordpress站点等),它对我有用。

我的备份脚本大致是:

cd /where/I/keep/backups && \
mysqldump > backup.sql && \
git commit -q -m "db dump `date '+%F-%T'`" backup.sql

这只存储差异吗?
user394 2010年

2
是。非常方便!您可以从任何时间点“签出”文件,而git会自动将diff组合在一起,为您提供当时存在的整个文件。
2010

1
这篇博客文章(不是我的博客)会更详细地介绍:viget.com/extend/backup-your-database-in-git 该评论更多地介绍了利弊。我还要补充一点,如果您使用git,则不仅可以回滚版本,还能获得更多的收益。您还可以标记转储,或具有单独的分支(dev / prod)。我看它的方式是git(或插入您喜欢的现代版本控制系统),比滚动自己的diff / gzip'solution'做得更好。关于本文的一个警告:不要将您的转储推送到github,除非您希望将其公开(或为私人仓库付费)。

1
Git的并不只是存储的diff。实际上,它主要存储每个修订版的完整快照,但是具有各种优化。看到这个出色的答案及其问题
颤抖2014年

3

您可以执行类似的操作(a.sql作为每周备份)。

mysqldump > b.sql
diff a.sql b.sql > a1.diff
scp a1.diff backupserver:~/backup/

您的差异文件到本周末将变大。

我的建议不过是gzip它(gzip -9用于最大压缩)。目前,我们这样做是为了使用59MB的gz文件,而原始文件为639MB。


我们已经
压缩

1

根据数据库转储的大小和实际文本相似性,可以采用几种可能的方法:

  1. 在未修改的转储上应用使用滚动校验和作为OP请求的重复数据删除备份程序,例如restic(https://restic.net/)或borgbackup(https://borgbackup.readthedocs.io/)。这两个系统甚至都可以通过FUSE挂载某个备份版本,并以所谓的永久增量方式工作。
  2. 将数据库结构与内容脱钩,类似于NCBI的人员如何利用其庞大的遗传数据库。也就是说:您将创建用于创建数据库模式的SQL脚本(例如ftp://ftp.ncbi.nlm.nih.gov/snp/organisms/human_9606_b151_GRCh38p7/database/organism_schema/),并将表的内容分别存储在任一目录中无插入语句的明文或压缩二进制格式(例如在ftp://ftp.ncbi.nlm.nih.gov/snp/organisms/human_9606_b151_GRCh38p7/database/organism_data/),例如制表符或逗号分隔的值。当然,这需要一个单独的导入例程,该例程将及时创建insert语句,以将数据重新导入数据库,即从备份中还原。如果您的DBMS提供了一个csv文件导入器,则可以省略上述附加脚本的要求。这样缩小的文本文件然后可以再次馈送到上述或其他常规备份程序(如rdiff-backup)中。
  3. 选择一种解决方案,其中结构和内容使用WEKA(https://www.cs.waikato.ac.nz/ml/weka/arff.html)之类的arff文件之类的格式进行松散耦合:列将在文件标题中声明,然后实际内容将再次以类似于csv的形式由@DATA语句分隔。如今,除了数据库连接器之外,许多ETL工具还提供Arff读取器。文件本身可以再次输入常规备份程序中

该答案回答了“如何进行数据库转储的滚动备份”问题,而不是更普遍的问题“如何对高度相似的备份进行滚动备份”,这是我所问的
user394

老实说,我怀疑您真正想要实现的是重复数据删除,这是第一种方法中提到的。也许您想看看restic.net/blog/2015-09-12/restic-foundation1-cdc进行了描述,然后您可以尝试一下吗?
jf1

详细充实的此评论将比您当前的回答更有意义。
user394

-3

(我尚未在生产中执行此操作。)

每天或每周执行一次完整备份。备份中继每小时或每天记录一次。


什么是中继日志?
user394 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.