增量备份脚本

增量备份脚本

我正在使用 rsync 命令进行增量备份,我的需求是将修改后的文件以当前日期的相同位置名称在不同目录中进行增量备份,但是当我使用 rsync 时,它将增量备份存储在完整备份中,而不是存储在名称日期目录中。我正在使用以下命令进行增量备份。

rsync -av --backup --backup-dir=/mnt/`date +%Y.%m.%d.%T`  /etc/ /mnt/

答案1

取决于你的意思增加的。一个技巧是在 EXT4 驱动器上使用硬链接。这意味着如果文件没有改变,它们将出现在每个快照中,但只会存在(并被复制到驱动器一次)。这是我以前使用过的脚本:

#!/bin/sh
NEW_FOLDER="$(date +%F\ %H-%M-%S)"
rsync --archive --human-readable --progress --link-dest /media/current "/etc/" "/media/incomplete/"
mv /media/incomplete /media/'$NEW_FOLDER'
rm -f /media/current
ln -s /media/'$NEW_FOLDER' /media/current

通过使用不完整文件夹,如果备份中途停止(对于大型备份非常有用),下次尝试时它会再次恢复。然后,您可以将每个文件夹作为完整的增量备份进行浏览。这是一种类似于 Apple Time Machine 的方法。

如果您不想使用硬链接来节省空间,并且不介意文件重复,请删除该--link-dest /media/current设置。

答案2

Rsync 默认会执行增量备份,但结果可能并非你所期望的那样。该命令

rsync -av /etc/ /mnt/

/etc仅传输已更改的文件。为此,它会比较和的内容/tmp。如果您添加计算日期,例如/tmp/$(date),目标文件夹为空,因此所有文件将再次传输。


选项--backup和只有在您需要备份文件时才有用,如果您使用选项--backup-dir启动命令,则会删除这些文件。rsync--delete


概括

要创建真正的增量备份,您将需要另一个工具,例如。rsnapshot

答案3

我之前一直在寻找答案,一开始我选择了 @Hadog 的答案。它运行完美,直到你通过网络连接运行 rsync,连接时出现故障。Rsync 将直接退出,不再重试。问题是,虽然失败了,但符号链接更改为不存在的新文件夹(断开的链接),导致 rsync 忽略 --link-dest。这意味着,将再次进行完整复制,而不是使用硬链接。

以下是我对@Hadog 脚本的修改,改进了错误处理方式:

#!/bin/sh

# determine how the new folder should be called
NEW_FOLDER="$(date +%F\ %H-%M-%S)"

rsync --archive --human-readable --progress --link-dest $PWD/current source "$PWD/destination"

# get exit code of rsync. -> don't put anything between this line and the rsync command!
rsync_exit_code=$?

# if the rsync command exited with a code that we consider "successfull" ...
if [ "$rsync_exit_code" -eq "0" ] || [ "$rsync_exit_code" -eq "23" ] || [ "$rsync_exit_code" -eq "24" ] 
then
    # move files to their actual destination
    mv $PWD/incomplete $PWD/"$NEW_FOLDER"
    
    # remove the old symlink
    rm -f current
    
    # set the symlink to the newest backup that we have just created
    ln -s $PWD/"$NEW_FOLDER" $PWD/current 
else
    echo "No moving of incomplete folder! Rsync exited with code $rsync_exit_code"
fi

显著的区别在于条件。如果我们确实有新的工作备份,我们才应该重置“当前”符号链接。对于我上面的例子,建立网络连接失败,这意味着备份脚本退出而不重试。重试就是重新运行脚本。您可能希望使用 do-while 循环重试 rsync 命令,直到成功,而不是使用 if 条件。

在我的代码中,我认为 rsync 的退出代码 0、23 和 24 是成功的。它们的含义如下(请参阅所有代码的 rsync 手册页):

  • 0:成功
  • 23:由于错误导致部分传输
  • 24:由于源文件消失导致部分传输

发布 4 个月后更新:上面提供的脚本到目前为止没有引起任何问题,因此我有信心说至少对我来说它是稳定的。

相关内容