2018年1月30日 星期二

用 logrotate 實現 「近密遠疏」 的備份計畫

Logrotate 本來是拿來備份系統 log 檔用的; 不過被我拿來充份利用、 備份自己的資料 :-) 我每天都會 (至少一次) 把最近幾天內更動過的檔案 (文件/圖片/...) 備份起來, 比方叫做 backup.zip 。 因為這個檔案很小, 所以可以不時上傳到雲端、 下載到隨身碟上。 但偶爾還是會需要挖出較舊的備份, 把檔案還原到舊版。 所以我會用 logrotate 把過去一週的 backup.zip 每天保留一個版本。

首先用 EDITOR=nano VISUAL=nano crontab -e 編輯你的 crontab, 在最後面加一句: 37 4 * * * /home/ckhung/work/daily-job.sh 之類的, 設定每天半夜 4:37 執行 daily-job.sh 。

我的 daily-job.sh 長得像這樣:

date >> /home/ckhung/archive/cron.log
find /home/ckhung/work -type f -mtime -3 | zip -@y /home/ckhung/archive/backup.zip
/usr/sbin/logrotate -s /home/ckhung/archive/logrotate.status /home/ckhung/work/logrotate.conf
DAYOFWEEK=$(date +"%w")
if [ "$DAYOFWEEK" == 6 ]; then
    # 每週六要做的事
    echo
fi

date 那句是為了要確認 cron 有設定成功, 每天有按時執行。 find 那句把 ~/work 底下最近 3 天內修改過的檔案都壓縮起來。 logrotate 那句會根據 ~/work/logrotate.conf 的設定來幫 backup.zip 做備份。 注意: 在 ubuntu 底下, logrotate 的執行檔不是放在 /usr/bin ! 如果沒有寫完整的路徑, 這句話會失敗。 最後那段 if 只是在示範如何順便把每週固定做的事順便寫在同一個檔案裡, 這樣 crontab 就不需要另外加一句。

至於 work/logrotate.conf 的內容則長得像這樣:

missingok
copy

/home/ckhung/archive/backup.zip {
    daily
    rotate 7
}

/home/ckhung/archive/backup.zip.1 {
    weekly
    rotate 5
}

/home/ckhung/archive/backup.zip.1.1 {
    monthly
    rotate 12
}

這樣可以製造 「近密遠疏」 的備份效果, 也就是說, 最近一週每天有一個版本的備份 (backup.zip.1 到 backup.zip.7)、 最近一個月每週至少有一個版本的備份 (backup.zip.1.1 到 backup.zip.1.5)、 最近一年每個月至少有一個版本的備份 (backup.zip.1.1.1 到 backup.zip.1.1.12)。 實際上我只做前兩層, 沒有做第三層, 所以隔一陣子之後, 所有的備份看起來類似這樣:

ckhung@localhost:~/copy $ ls -trl update*
-rw-r--r-- 1 ckhung ckhung  90742  1月  1 04:37 update.zip.1.5
-rw-r--r-- 1 ckhung ckhung 532881  1月  7 04:37 update.zip.1.4
-rw-r--r-- 1 ckhung ckhung 515260  1月 15 04:37 update.zip.1.3
-rw-r--r-- 1 ckhung ckhung  73122  1月 21 04:37 update.zip.1.2
-rw-r--r-- 1 ckhung ckhung 711893  1月 24 04:37 update.zip.7
-rw-r--r-- 1 ckhung ckhung 749767  1月 25 04:37 update.zip.6
-rw-r--r-- 1 ckhung ckhung 742107  1月 26 04:37 update.zip.5
-rw-r--r-- 1 ckhung ckhung 163966  1月 27 04:37 update.zip.4
-rw-r--r-- 1 ckhung ckhung 163966  1月 28 04:37 update.zip.3
-rw-r--r-- 1 ckhung ckhung 163966  1月 29 04:37 update.zip.2
-rw-r--r-- 1 ckhung ckhung 163966  1月 29 04:37 update.zip.1.1
-rw-r--r-- 1 ckhung ckhung 163966  1月 30 04:37 update.zip.1
-rw-r--r-- 1 ckhung ckhung 163966  1月 30 10:30 update.zip

配合人腦 「對最近的事情比較關心」 的特性, 用很少的空間, 備份很久的資料, 很方便吧!

2 則留言:

  1. logrotate的執行檔是不是放在/usr/bin似乎得看distribution是怎麼打包的

    回覆刪除