Backup

按日期備份的增量文件

  • April 7, 2019

有沒有支持按日期進行部分備份的備份工具?我的意思是我有一些小型驅動器,例如在筆記型電腦上無法保存外部 2TB 驅動器上所有文件的完整副本。我想在筆記型電腦上保留最新的文件,通常是我正在使用的文件。但同時我希望能夠同步其他儲存空間有限的驅動器。因此,每個小驅動器都應該包含在某個日期(例如 3 個月前)之後創建或修改的文件。假設我有 2 台筆記型電腦,每台都有不同的磁碟大小。對於具有較小驅動器的筆記型電腦,我可能只希望存在上個月的文件。兩台筆記型電腦上的所有文件都應備份在大型外部驅動器上,以及超過 3 個月的所有其他存檔文件。因此,外部驅動器應該鏡像兩個較小的驅動器並使它們保持同步。我試過使用unison但它似乎不支持按日期備份。也許rsync使用一些 shell 腳本可以工作,但我想在實施新的解決方案之前先檢查是否存在解決方案。

我沒有為此使用任何專用程序,但是使用 cron、bash、tar(增量轉儲)和/或 rsync的組合很容易組織和微調。在我看來,有兩種最佳解決方案,我會根據具體情況使用其中一種或兩種。我認為第一個更適合你,但我會在這裡描述兩者。

增量焦油檔案

這個解決方案的核心是一個可能看起來像這樣的腳本:

#!/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,我認為第二個解決方案更易於管理,並且所有文件始終可用。另一方面,使用存檔可以利用壓縮,使用更少的 inode,並且在非伺服器機器上還有其他優點。

同樣,盡可能在 crontab 中執行所有這些操作,這樣您就不必記住它了。如果您沒有一直打開筆記型電腦,請選擇一個經常使用它的時間,並且可能每天進行幾次,以便至少啟動一些 cron 作業。更好的是,使用類似anacron的東西。

您還可以手動執行備份腳本,如果您想每天多次執行增量,則可以細化文件名/目錄中的日期。顯然,您將需要使用這些解決方案以使它們適合您的案例。

更新:帶有我使用的範例腳本的儲存庫:https ://github.com/langner/backup.sh/blob/master/backup.sh

引用自:https://unix.stackexchange.com/questions/132819