使用 rsync 进行 Git 风格的增量备份

使用 rsync 进行 Git 风格的增量备份

我正在尝试在 Ubuntu 上设置一个备份脚本。每天我都想将本地源目录复制到远程服务器上以日期唯一命名的备份目录。(例如,backup-jan1/、backup-jan2/ 等)它应该存储最早状态的镜像并使用差异文件重新创建新的备份点。

使用 rsync 非常简单。我已经设置了一个脚本,它将进行备份,用当前日期命名备份目录,并创建指向最新备份的符号链接(IP 已被编辑):

date=`date "+%m%d"`
rsync -ave ssh /srv [email protected]:/backup/backup-$date/
ssh [email protected] rm -rf /backup/current
ssh [email protected] ln -s backup-$date/ /backup/current

然而,这里有一个棘手的部分:我不希望它复制未改变的文件。因此,如果自上次每日备份以来有任何文件发生变化,它会像平常一样复制这些文件。否则,它将把未改变的、以前备份的文件从其第一个备份目录符号链接到新的备份。(有点像 git)

例如,假设我从 1 月 1 日开始备份。backup-jan1/ 目录将包含所有原始备份文件。第二天,1 月 2 日的备份应该只复制在那 24 小时内更改的文件。对于所有其他文件,它将从 1 月 1 日的备份文件创建符号链接。1 月 3 日,我添加了一个文件并删除了另一个。如果删除了某个文件,则不应继续对其进行符号链接。

目录/文件结构示例:

backup-jan1/ (initial backup)
    file_a
    file_b

backup-jan2/ (no changes)
    file_a (symlink to ../backup-jan1/file_a)
    file_b (symlink to ../backup-jan1/file_b)

backup-jan3/ (removed file_a symlink and added file_c)
    file_b (symlink to ../backup-jan1/file_b)
    file_c

...

我尝试在 rsync 中寻找这种版本控制类型的功能,并且快照,但我还没有找到。有人能建议这样的备份策略吗?

答案1

你似乎正在寻找的是--link-destrsync 的功能。你似乎描述的正是迪尔维什运行。

link-dest 选项创建从目标路径到结构的另一个副本的硬链接。

使用 dirvish 执行初始备份,只需使用 rsync。

此后,每次额外的备份都与之前成功的备份硬链接。这意味着没有文件重复。您可以直接从保管库中访问任何单个备份,并且每次备份都是完整的备份。您可以随时删除以前的备份。

这是一个您可以用来演示的脚本。

# create test area
mkdir -p /tmp/backuptest/{source,dest1,dest2,dest3}
for a in `seq 10` ; do dd if=/dev/urandom of=/tmp/backuptest/source/file$a bs=1M count=1; done

# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

# initial backup
rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest1/

# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

# make chagnes
rm /tmp/backuptest/source/file[2-4]
cat /tmp/backuptest/source/file[6-7] >/tmp/backuptest/source/file11

# new backup linked to previous
rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest2/ --link-dest=/tmp/backuptest/dest1/

# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

# make changes
rm /tmp/backuptest/source/file5
cat /tmp/backuptest/source/file[5-7] >/tmp/backuptest/source/file12

# new backup linked to previous
rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest3/ --link-dest=/tmp/backuptest/dest2/

# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

# remove dest1
rm -r /tmp/backuptest/dest1/

# see your dest2, and dest3 are still complete backups for the state at those times.
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

答案2

您可以使用“cp”和“-l”选项复制为硬链接。如果所有源和目标都在同一个文件系统上,那么速度会非常快。

因此,您的原始目录是“backup-jan1”,下一个目录是“backup-jan2”。在这种情况下,请执行以下操作:

cp -al backup-jan1 backup-jan2

然后针对 backup-jan2 运行 rsync。当 rsync 遇到更改的文件时,它将取消与 backup-jan1 中原始文件的链接,并在 backup-jan2 中创建一个新文件(同名)。

第二天,你会这样做:

cp -al backup-jan2 backup-jan3

使用 rsync 同步到 backup-jan3。同样,备份中的新文件将导致 backup-jan3 中的链接被取消,等等。

在这种情况下,如果 backup-jan1 中有 3 个文件,其中 file1 在三天内保持不变,file2 只在 jan2 发生变化,而 file3 每天都会发生变化,则 file1 会在三个目录中以相同的方式硬链接,file2 会有两个文件(一个在 backup-jan1 中,另一个在 backup-jan2 和 backup-jan3 中,这两个文件是硬链接的),file3 会在每个目录中以三个文件的形式存在。

相关内容