使用 rsync 进行远程增量备份?

使用 rsync 进行远程增量备份?

我正在尝试设置 rsync 以将增量备份发送到远程服务器。第一次备份将发送到“backup”文件夹,然后下一次备份将仅将更改发送到“backup.1”文件夹,依此类推。

我设法使用以下命令在本地执行此操作,该命令似乎按描述工作,并在第二次同步时创建了 backup.1 文件夹:

rsync -zaP folder_to_backup /backup  

然后,我设置了一个 ssh 密钥对,并设法使 rsync 远程工作,所以我现在使用:

rsync -zaP folder_to_backup myuser@myserver:/home/myuser/backup

同步确实有效,文件出现在删除服务器上。但是,当我第二次运行它时,新文件只会添加到现有的“备份”文件夹中,而不是创建 backup.1 文件夹。我还尝试了其他带有 -b 参数的命令,例如:

rsync -zaPb folder_to_backup myuser@myserver:/home/myuser/backup
rsync -aPb --backup-dir=`date +%s` folder_to_backup myuser@myserver:/home/myuser/backup

但在所有情况下它的作用都是一样的。在最后一种情况下,同步仍然转到“备份”文件夹,backup-dir 参数似乎被完全忽略了。

我究竟做错了什么?

编辑:阅读评论时,当我说“它似乎按描述工作,在第二次同步时创建一个 backup.1 文件夹”时,我可能会感到困惑。这就是我记得的,但显然它不是 rsync 的功能?
相反,我现在安装了 rsnapshot,它非常适合增量备份。

答案1

我写这个脚本它用于--link-dest仅传输新文件,同时硬链接所有未更改的文件。这样,只有传输是增量的,而每次备份本身都是完整的备份。示例:

src_path="/home/user“
dst_path="user@server:/home/Backups"
rsync_options=(
  --archive # same as --recursive --links --perms --times --group --owner --devices --specials
  --human-readable # output numbers in a human-readable format
  --itemize-changes # output a change-summary for all updates
  --exclude="[Tt][Ee][Mm][Pp]/" # exclude dirs with the name "temp" or "Temp" or "TEMP"
  --exclude="[Tt][Mm][Pp]/" # exclude dirs with the name "tmp" or "Tmp" or "TMP"
  --exclude="Cache/" # exclude dirs with the name "Cache"
)
empty_dir="/tmp/empty_dir"
new_backup="$(date +%Y%m%d_%H%M%S)"
last_backup=$(rsync --dry-run --recursive --itemize-changes --exclude="*/*/" --include="[0-9]*/" --exclude="*" "$dst_path/" "$empty_dir" | grep -oP "[0-9_/]*" | sort -r | head -n1)
last_backup="${last_backup/$(echo "$dst_path" | grep -oP "^.*:")/}" # remove ssh login
rsync "${rsync_options[@]}" --stats --delete --link-dest="$last_backup" "$src_path/" "$dst_path/$new_backup"

当然,只有当目标文件系统支持硬链接时这才有效,但大多数都应该支持。

我希望 rsync--reflink将来能够支持减少大文件中小改动的存储使用。

相关内容