我正在托管一个页面并且可以通过 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 月底的情况,但不会太关心当月内的情况如何变化。)
显然,您需要更改频率、时间戳等,并添加可移植性代码,但相同的机制应该可以完成您想要的操作。