介紹如何在 Linux 系統上使用 rsync
指令進行資料的增量備份,配合硬連結製作各時間的點的檔案快照。
資料的備份方式可分為完全備份(full backup)、差異備份(differential backup)與增量備份(incremental backup),各種備份方式各有優缺點,其差別可以參考維基百科與 YouTube 的影片。
在 Linux 中我們可以使用 rsync
指令以增量備份的方式備份資料,並配合硬連結(hard link)建立每個時間點的完整檔案快照(snapshot),以這種方式備份資料既快速又節省資料儲存空間,同時也可以輕易取得每個時間的檔案快照,是一種非常方便的備份方法。
以下是一段簡單的 rsync
快照備份指令稿,只要修改目錄設定之後,就可以直接放在 crontab 中執行,每次備份時會自動以時間來建立一個獨立的備份目錄,執行此備份指令稿的週期可以任意調整。
#!/bin/bash # 出錯時離開指令稿 set -o errexit # 不允許使用未定義的變數 set -o nounset # 管線中間出錯時傳回錯誤 set -o pipefail # 原始資料來源目錄 readonly SOURCE_DIR="/data/source" # 備份資料根目錄 readonly BACKUP_DIR="/data/backup" # 本次備份目錄 readonly DATETIME="$(date '+%Y%m%d_%H%M%S')" readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}" # 最新備份目錄連結名稱 readonly LATEST_LINK="${BACKUP_DIR}/latest" # 建立新備份目錄 mkdir -p "${BACKUP_DIR}" # 建立備份 rsync -av --delete \ --link-dest "${LATEST_LINK}" \ "${SOURCE_DIR}/" \ "${BACKUP_PATH}" # 移除舊連結、建立新連結 rm -rf "${LATEST_LINK}" ln -s "${BACKUP_PATH}" "${LATEST_LINK}"
這裡這裡在備份資料時會將每一個時間點所備份的資料放置在不同的目錄之下,也就是說每一個目錄之下就是各時間點的檔案快照。隨著時間會有許多的備份目錄,而我們為了方便起見,會建立一個 lastest
連結檔,指向最新的備份目錄。
當我們要新增一個備份目錄時,只有那些有異動的檔案會從原始資料目錄複製過來,沒有變動的檔案會直接從上一個備份目錄(也就是 lastest
指向的目錄)中建立硬連結,這就是 rsync
加上 --link-dest
參數的作用。
在第一次執行這個備份指令稿時,由於沒有任何之前的備份目錄,rsync
的 --link-dest
參數等於沒有作用,所以會直接複製整個資料來源目錄,做一次完整備份(full backup),而在第一次的完整備份之後,後續的備份都可以參考前一次的備份目錄,進行增量備份,所以後續備份的速度會非常快。
增量備份配合硬連結之後,每一個目錄都會是一個完整的快照,要還原至任何一個時間點也都非常方便。
在 rsync
的參數中,跟 --link-dest
類似的還有 --compare-dest
與 --copy-dest
,--compare-dest
會比較資料來源目錄與指定目錄中的檔案,忽略已經有的檔案,也就是增量備份,而 --copy-dest
的效果跟 --link-dest
類似,只不過對於沒有異動的檔案,它是用複製的方式建立檔案,不是硬連結。
參考資料:nixCraft、Tyler’s Guides、LinuxConfig.org、Dev Notes、jveweb.net、mikerubel.org、Earl C. Ruby III、StackExchange、StackExchange