按日期增量文件备份

按日期增量文件备份

有没有支持按日期部分备份的备份工具?我的意思是,我有一些小型驱动器,例如笔记本电脑上的驱动器,无法保存外部 2TB 驱动器上所有文件的完整副本。我想在笔记本电脑上保留最新的文件,这些文件通常是我正在使用的文件。但同时我希望能够同步其他存储空间有限的驱动器。因此,每个小驱动器应包含在特定日期(例如 3 个月前)之后创建或修改的文件。假设我有两台笔记本电脑,每台都有不同的磁盘大小。对于驱动器较小的笔记本电脑,我可能只希望显示上个月的文件。两台笔记本电脑上的所有文件以及 3 个月以上的所有其他存档文件都应备份在大型外部驱动器上。因此,外部驱动器应该镜像两个较小的驱动器并保持它们同步。我尝试过使用unison,但似乎不支持按日期备份。也许rsync使用一些 shell 脚本就可以工作,但我想在实施新解决方案之前先检查是否存在解决方案。

答案1

我没有为此使用任何专用程序,但通过 cron、bash、tar 的组合来组织和微调非常容易(增量转储) 和/或 rsync。在我看来,有两种最佳解决方案,我根据具体情况使用两者或其中之一。我认为第一个更适合您,但我将在这里描述两者。

增量 tar 档案

该解决方案的核心是一个可能如下所示的脚本:

#!/bin/bash

# You will need to set the variables $EXCLUDE, $DATA and $BACKUPS
# as environment variables, in ~/.bashrc or somewhere.

OPTS="--create --no-check-device --bzip2 --verbose -X $EXCLUDE"
for d in `ls $DATA`; do
    SNAPSHOT=$BACKUPS/$d.snar
    if [ $1 == full ]; then
        echo "Archiving $d (full)..."
        rm -rvf $SNAPSHOT
        ARCHIVE=$DATA/$d.`date --iso-8601`.full.tar.bz2
        tar $OPTS --file=$ARCHIVE --listed-incremental=$SNAPSHOT $DATA/$d
    fi
    if [ $1 == increment ]; then
        echo "Archiving data/$d (increment)..."
        ARCHIVE=$DATA/$d.`date --iso-8601`.tar.bz2
        tar $OPTS --file=$ARCHIVE --listed-incremental=$SNAPSHOT $DATA/$d
    fi
done

这假设有子目录,$DATA并且每个子目录都备份在单独的存档中。如果您的设置不同,请自定义脚本。

您可以在 crontab 中安排备份,如下所示:

# m  h  dom mon dow   command
  44 1  1   */2 *     ~/bin/backup_data full > ~/backups/data/logs/`date --iso-8601`.full.log 2>&1
  44 5  *   *   *     ~/bin/backup_data increment > ~/backups/data/logs/`date --iso-8601`.log 2>&1

正如您所看到的,在这种情况下,每两个月创建一次完整备份,并且每天都会创建从该完整转储开始的增量备份。当您丢失一个文件甚至更改时间戳时,tar 中的增量存档就会出现问题。因此,偶尔创建一次完整转储是谨慎的做法。

至于机器之间的同步和删除旧文件,您应该将该任务与备份本身分开,因为它确实是正交的。当然,使用 rsync 进行同步,不使用该--delete选项,这样您就不会丢失大型外部驱动器上的任何数据。所以你的命令可能是:

rsync -av /backups/data /mnt/external

如果笔记本电脑上安装了外部驱动器。否则,您将需要通过网络执行此操作,如下所示:

rsync -av /backups/data user@external:/backups/data

如果您想从笔记本电脑中清除超过 90 天的存档,您可以这样做:

find /path/to/files -type f -mtime +90 -delete

再次,将这些内容放入您的 crontab 中。

使用 rsync 进行增量备份

您可以单独使用 rsync 来增量备份。我特别喜欢使用带时间戳的快照和硬链接,这只是一个命令。这是一个接近我通常使用的示例:

rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/`date --iso-8601 -d "one day ago"` /data/ /backups/data/`date --iso-8601`/

--link-dest它基本上为未更改的文件创建到前一天快照(由 给出的快照)的硬链接。如果您运行不规律,您可以使用指向最新快照的符号链接,并在备份后更新该符号链接,如下所示:

rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/last /data/ /backups/data/`date --iso-8601`/ && rm -rvf /backups/data/last && ln -vs /backups/data/`date --iso-8601`/ /backups/data/last

最重要的是,您需要组织与外部驱动器的同步并删除旧快照。一般来说,这与我上面概述的第一个解决方案中的方法相同。但是,在计算机之间重新同步快照时,请确保使用-H保留硬链接的选项。

概括

与使用 的解决方案相比tar,我认为第二个解决方案管理起来更简单,并且所有文件始终可用。另一方面,使用存档可以利用压缩、使用更少的索引节点,并且在非服务器计算机上还有其他优点。

再次强调,尽可能在 crontab 中执行所有这些操作,这样您就不必记住它。如果您没有一直打开笔记本电脑,请选择经常使用的时间,也许每天执行几次,以便至少启动一些 cron 作业。更好的是,使用类似的东西纳克朗

如果您想每天进行多次增量操作,您还可以手动运行备份脚本,并细化文件名/目录中的日期。显然,您需要尝试使用这些解决方案以使它们适合您的用例。

更新:带有我使用的示例脚本的存储库:https://github.com/langner/backup.sh/blob/master/backup.sh

相关内容