Linux tar 完整備份、增量備份及差異備份比較
最近想架設 NextCloud 來放一些東西,但是無奈 VPS 空間太小,於是四處尋找便宜的 Storage VPS,經過一段時間搜尋,覺得 BudgetNode STOR250 價格上跟容量上都還算 OK ($24 / y),猶他州離本來的主機洛杉磯也不算太遠(應該吧),準備要下手的時候突然想到,小蛙的 VPS 加一加也有 50, 60 GB,而且大部份空間都是放互相備份的檔案,如果可以把備份檔案移去別的地方放著,e.g. Google Drive(誤),那就有更多空間可以儲存了,等到時候真的不夠再買好了,於是就開始了今天的跳坑記。
首先查了很多備份的問題,小蛙原本是將要備份的目錄 tar 成 bz2,然後透過 Dropbox 機制同步到雲端儲存,因空間問題再搭配計算天數的指令,來定期刪除 n 天前的備份,剛去翻這篇文章竟然已經是 Ubuntu 11.04 的事情,真是慚愧 …
這樣做遇到一個問題是,因為主機上及 Dropbox 空間太小,可以留存的備份天數就很少,好處是每一份備份都是完整備份,由於天天備份,萬一系統出了問題,也可以抓前一天的備份出來直接上。
Tar 備份方案
既然空間不足,又不買新空間,那就找看看其他備份方案,上網搜尋了下,知道 tar 可以做到三種備份:
完整備份
就是小蛙現在正在用的方案,每個備份檔案都是完整的,優點是每次只要把單檔解壓縮蓋回就好了,缺點就是佔用空間大。
差異備份
設定一個時間點做完整備份,往後的備份以這個備份為基礎,有變動的檔案才進行備份,例如:
每個月 1 號進行完整備份,往後的 29 ~ 30 號都進行差異備份,
如果在 15 號的時候需要進行資料回復,只需要 1 號的完整備份 + 14 號的差異備份,即可得到 14 號的完整備份。
優點是跟完整備份比較起來儲存空間可以降低不少,缺點是如果後面的備份資料變動跟基礎完整備份差異太多,跟增量備份比較起來,也還是會佔用不少空間。
增量備份
這個方案前半部跟差異備份一樣,都必須要先有一個完整備份為基礎,後面的備份都是跟上一份備份來做比較,例如:
每個月 1 號進行完整備份,往後的 29 ~ 30 號都進行增量備份。
如果在 15 號的時候需要進行資料回復,此時需要 1 號的完整備份 + 2 ~ 14 號的增量備份,才可以得到 14 號的完整備份。
由於每個增量備份都是以上一個備份為基礎,因此回復備份的時候 2 號的要根據 1 號,3 號的要根據 2 號,以此類推,才能得到所有的備份。
優點是儲存空間理論上會是三者最少,缺點是還原要一步一步照順序進行,以及如果少了其中一個,就沒辦法正確還原。三種方案都有好有壞,青菜蘿蔔各有所好,沒有一定好或是一定不好,完全取決於 適不適合自己的環境及使用習慣 。基於上述分析,小蛙最後選擇了「增量備份」。
Tar 增量備份流程
小蛙本來就有完整備份的腳本(詳情請參考定期備份WordPress到Dropbox),只要拿來修改一下就可以用了。
- 建立備份的時候,必須透過 -g 參數來指定記錄檔
- 如果記錄檔不存在,會建立一個記錄檔並執行完整備份,把備份資訊記錄在記錄檔中
- 如果記錄檔已存在,就會以此記錄檔為基礎進行增量備份
上面看起來應該很好理解吧!下面是小蛙自己用來備份 /var/www 的指令
tar -g 記錄檔位置 -jpc -f 備份檔案名稱.tar.bz2 --one-file-system 要備份的資料夾
-g 記錄檔位置:這裡最好使用絕對路徑,e.g. /root/snapshot
-jpc bz2 的壓縮參數
-f 備份檔案名稱:bj4
–one-file-system 只限制本機的檔案系統
指令看起來有點複雜,但是只要照著填就可以了,例如:
tar -g /root/snapshot-www -jpc -f /root/vpsbackup/www-$(date +%Y%m%d).tar.bz2 --one-file-system /var/www
檔案名稱可以隨便取,有些人可能會把完整備份取名為 www-fullbackup-xxxx.tar.bz2,增量備份取名為 www-incremental-xxxx.tar.bz2,這個純粹是為了讓自己好辨識,如果確定 1 號一定是完整備份,其他天一定是增量備份,倒也是不用這麼麻煩。
這裡要特別介紹的一個參數是--one-file-system
,小蛙剛開始測試的第二天,就發現奇怪,/var/www 的備份為什麼兩個差不多大,到底哪裡出了問題,仔細一查才發現,原來小蛙在 /var/www 下面有掛載其他主機,因此在下 tar 指令的時候,把這些檔案全部一起 tar 進去了,又正好小蛙上傳了一批資料,所以第一天的完整備份原本就很大,第二天又增加了剛好差不多量的資料,造成第二天的檔案跟第一天的一樣大 … 真是太巧合,下了--one-file-system
排除之後,完整備份檔跟增量備份檔的 size 就正常了。
有了備份檔之後,當然是希望用不到,但是世事難料,如果真的必須要用上,請服用以下指令
tar -jxv -G -f www-2018-11-01.tar.bz2 -C /root/recovery tar -jxv -G -f www-2018-11-02.tar.bz2 -C /root/recovery ... # 要從 1 號的完整備份,一直執行到前一天的增量備份 tar -jxv -G -f www-2018-11-14.tar.bz2 -C /root/recovery
小蛙一開始看到沒有介紹完全的文章,裡面提及 tar 增量備份無法記錄刪除動作,也就是原本有 a b c 三個檔案,後來增量備份刪除 c 並增加 d,當還原的時候會出現 a b c d 四個檔案,這小蛙一看就覺得問題很大,用這來備份最後一定會出問題,而 -G 就可以完全避掉這個困擾,加上這參數後,就可以正確還原 a b d 四個檔案了!
其他的坑,小蛙將陸續更新。