使用rsync进行增量备份

Mar*_*kus 2 ssh bash backup cron rsync

我正在托管一个页面并可以通过 ssh 访问该网络空间。

该网站允许其用户进行修改。为了能够将其恢复到较旧的状态,我考虑使用 rsync 每 30 分钟创建一次增量备份,使用 cron 启动以下脚本。

#!/bin/bash

# Binaries
RSYNC=`which rsync`
LN=`which ln`
MKDIR=`which mkdir`
#TODO: Is this enough to make the script distro independent?

# Other Variables
source="<username>@<provider>:<workspace path>"
target="<local backup path>"
# Date ...
year=$(date +%Y)
month=$(date +%m)
day=$(date +%d)
# ... and time
hour=$(date +%H)
minute=$(date +%M)

# Prepare directories
$MKDIR -p $target/$year/$month/$day/"$hour"_"$minute"/
# TODO: Why is this necessary? The actual backup won't work without this line
# saying "directory does not exist...".

# Actual backup
$RSYNC -av --delete "$source" "$target/$year/$month/$day/"$hour"_"$minute"/" --link-dest="$target/latest/"
$LN -nsf "$target/$year/$month/$day/"$hour"_"$minute"/" "$target/latest"

# End script
exit 0
Run Code Online (Sandbox Code Playgroud)

到目前为止,该脚本似乎可以工作,但目标路径在过去三天内膨胀到源路径实际大小的大约三倍。

增量备份应该只会导致少量的增加,对吗?

我究竟做错了什么?

提前致谢

马库斯

B.T*_*ner 5

如果您的备份介质具有 Linux 格式,例如 ext3 或 ext4(可能应该如此,否则文件属性将无法备份),那么您可以使用 rsync 和 cp -al 来充分利用某个功能,从而实现一个巧妙的技巧文件系统的:您执行增量备份,但随后在每次备份时创建指向文件的硬链接。这意味着您只复制已更改的文件,但备份介质只有每个文件的一个副本,因此大小不会膨胀(我不能将此归功于;这是在对很久以前的一篇评论中的评论)我无法再次找到的问题。)

我的(每日)备份类似于:

DEST=/media/$USER/backups         # the name my backup media is mounted under
rsync -av --progress --delete --exclude ".[!.]*"  ~/ $DEST/current
DATE=`date -I`
mkdir $DEST/$DATE
cp -al $DEST/current/ $DEST/$DATE
Run Code Online (Sandbox Code Playgroud)

这仅使用已更改的文件更新“当前”,但创建一个以今天的日期命名的目录,并包含指向所有文件的硬链接。因此,每天的备份似乎包含原位的所有文件,但实际上备份介质上只有一份副本。后一点也是缺点:由于每个文件只有一个副本,因此您应该旋转介质,以便拥有多个副本,但无论如何,这是很好的备份做法。

  • 确实是一个巧妙的技巧,但是“rsync”有一个开关“--link-dest”,它已经创建了到另一个(例如昨天的)目录的硬链接。基本上你会说“rsync -a --delete --link-dest=$previous $source $current”。 (2认同)
  • @PerlDuck 谢谢我不知道 --link-dest,我没有找到 rsync 的手册页清晰的杰作!问题可能是,要使用 --link-dest 执行相同的操作,您需要知道最后一个备份目录的名称,“date -I -d昨天”将为每日备份执行此操作,但如果您错过了一个,则会失败,例如在一个星期日。 (2认同)