使用 rsync 进行增量备份

使用 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

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

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

我究竟做错了什么?

提前致谢

马库斯

答案1

如果您的备份媒体具有 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

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

答案2

实际上,已经有一个基于 rsync 的工具可以做到这一点。它被称为 rdiff-backup,我过去曾多次使用它来创建增量备份,它支持回滚到以前的状态。它还可以配置为清理旧备份,这样您的备份目录就不会一直增长。

在这里了解更多信息并查看文档页面上的使用示例:http://rdiff-backup.nongnu.org/

答案3

根据 B.Tanner 的回答,这是一个每 60 秒测试一次的脚本,如果有任何文件发生变化,它将创建一个备份,您应该有 2 个文件夹 backups/OLD 和 backups/current

while true  
do 
DEST=/home/$USER/backups         # the name my backup media is mounted under
if [ -n "$(rsync -ai --delete  --exclude ".[!.]*"  $(pwd)/ $DEST/current)" ]; then
    DATE=`date +"%m-%d-%y"`
    TIME=`date +"%T"`
    mkdir -p $DEST/OLD/$DATE
    mkdir $DEST/OLD/$DATE/$TIME
    cp -al $DEST/current/ $DEST/OLD/$DATE/$TIME
    echo "done:$DATE/$TIME"
fi
sleep 60   
done

答案4

rsync 程序已经有了可以执行您想要的备份选项。

这是我用于备份的脚本,每天 23:45 以 root 身份运行:

#!/bin/bash -e
# This is run as root at the end of the day

(   echo ">>>>>>>>>>>>>>>>>>>>>>>" $(date)
    today=$(date +%Y-%m-%d)
    month=$(date +%Y-%m)
    # USB backups
    cd /media/ray/Backup-Ray
    rsync --archive --one-file-system --delete --backup \
        --backup-dir="../../$today/etc" "/etc/" "mostrecent/etc/"
    rsync --archive --one-file-system --delete --backup \
        --backup-dir="../../$today/home" \
        --exclude=".config/google-chrome/" \
        --exclude=".local/share/zeitgeist/" \
        --exclude=".cache/" --exclude="Trash/" --exclude="Downloads/" \
        "/home/" "mostrecent/home/"
    rsync --archive --ignore-existing $today/ $month/
    echo "<<<<<<<<<<<<<<<<<<<<<<<" $(date)
) &>>/home/ray/Log/root.out

exit 0

所有更改和删除的文件都会被保留。使用标准 unix 工具检查和恢复文件非常简单:

$ cd /media/ray/Backup-Ray
$ ls -l {,*}/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14002 Dec  3 21:04 2018-12-16/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14102 Dec 16 09:28 2018-12-17/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14202 Dec 17 20:47 2018-12-20/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14302 Dec 20 15:12 2018-12-25/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14402 Dec 25 21:21 2018-12-26/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14002 Dec  3 21:04 2018-12/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14452 Dec 26 18:43 /home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14452 Dec 26 18:43 mostrecent/home/ray/public/Log/wait.xhtml

只有“mostrecent”目录较大。

每月累积目录(2018-12)包含整个月内最早的更改。没有必要执行此步骤,但是当我需要节省空间时,它允许我删除该月的所有每日更新(一年后,我可能会关心 12 月底的情况,但不会太关心当月内的情况如何变化。)

显然,您需要更改频率、时间戳等,并添加可移植性代码,但相同的机制应该可以完成您想要的操作。

相关内容