當(dāng)前位置:首頁 > IT技術(shù) > 系統(tǒng)服務(wù) > 正文

0基礎(chǔ)linux運(yùn)維教程 增量備份
2021-09-28 16:49:59

增量備份(incremental backup)是備份的一個類型,是指在一次全備份或上一次增量備份后,以后每次的備份只需備份與前一次相比增加或者被修改的文件。

五 增量備份

rsync 的最大特點(diǎn)就是它可以完成增量備份, 除了源目錄與目標(biāo)目錄直接比較,rsync還支持使用--link-dest參數(shù)用來指定同步時的基準(zhǔn)目錄,即將源目錄與基準(zhǔn)目錄之間變動的部分,同步到目標(biāo)目錄。

$ rsync -a --delete --link-dest /compare/path /source/path /target/path
上面命令中,--link-dest參數(shù)指定基準(zhǔn)目錄/compare/path
然后源目錄/source/path跟基準(zhǔn)目錄/compare/path進(jìn)行比較,找出變動的文件,將它們拷貝到目標(biāo)目錄/target/path。
那些沒變動的文件則會生成硬鏈接,硬鏈接指向上一個/target/path中的文件。這個命令的第一次備份時是全量備份,后面就都是增量備份了。

[root@local <sub>]# mkdir /data
[root@local </sub>]# echo 111 > /data/1.txt
[root@local <sub>]# echo 222 > /data/2.txt
[root@local </sub>]#
[root@local <sub>]# mkdir /bak
[root@local </sub>]#
[root@local <sub>]#
[root@local </sub>]# # 第一次,全量
[root@local <sub>]# rsync -a --delete /data/ /bak/111/
[root@local </sub>]#
[root@local <sub>]# # 比較上一次備份與當(dāng)前/data,將增量備份到新目錄中
[root@local </sub>]# echo 333 > /data/3.txt
[root@local <sub>]# rsync -a --delete --link-dest /bak/111/ /data/ /bak/222 #
[root@local </sub>]# echo 666 >> /data/1.txt
[root@local <sub>]# rsync -a --delete --link-dest /bak/222 /data/ /bak/333
[root@local </sub>]# rm -rf /data/2.txt
[root@local <sub>]# rsync -a --delete --link-dest /bak/333 /data/ /bak/444
[root@local </sub>]#

與傳統(tǒng)的增量備份略有不同的是,rsync的每次增量都會保留源目錄中的全部文件,但是若文件較之上一次沒有變化,則新備份中的文件只是創(chuàng)建了一個指向上一次對應(yīng)文件的硬鏈接,這就保證了在不浪費(fèi)空間的前提下保證了rsync的增量備份在恢復(fù)數(shù)據(jù)時,只需要找到一份備份既可以恢復(fù)到指定的狀態(tài),這就使得其數(shù)據(jù)恢復(fù)過程的簡潔性與完全備份一樣了,但它還比全量備份的數(shù)據(jù)量要小很多。 下面是一個腳本示例,備份/opt目錄。

#!/bin/bash
# A script to perform incremental backups using rsync
set -o errexit # 它使得腳本只要發(fā)生錯誤,就終止執(zhí)行,而不是一聲不響地往下執(zhí)行
set -o nounset # 在shell中,遇到變量不存在,并不會報錯,而是輸出空,然后繼續(xù)執(zhí)行后續(xù)代碼
# 開啟nounset選項后,腳本若碰到變量為定義則報錯并終止運(yùn)行




set -o pipefail # 上面的選項errexit針對管道命令是無效的,比如xxx | echo "egon",并不存在
# xxx命令,但是該管道命令整體是執(zhí)行成功的,加上pipefail選項后則可以防止這件事
readonly SOURCE_DIR="/opt" # 備份的源目錄
readonly TARGET_START_DIR="/egon/backups" # 目標(biāo)目錄的起始目錄
readonly TARGET_DIR="${TARGET_START_DIR}/$(date '+%Y-%m-%d_%H:%M:%S')" # 目標(biāo)目錄
readonly LATEST_LINK="${TARGET_START_DIR}/latest" # 基準(zhǔn)目錄
mkdir -p "${TARGET_START_DIR}" # 先把目標(biāo)目錄的起始目錄創(chuàng)建好
rsync -av --delete
"${SOURCE_DIR}/"
--link-dest "${LATEST_LINK}"
--exclude=".cache"
"${TARGET_DIR}"
# 刪除基準(zhǔn)目錄LATEST_LINK,然將最新一次備份ok的目標(biāo)目錄鏈接到LATEST_LINK作為下一次的基準(zhǔn)目錄
rm -rf "${LATEST_LINK}"
ln -s "${TARGET_DIR}" "${LATEST_LINK}"

解釋

1、首次執(zhí)行該腳本
--link-dest指定的基準(zhǔn)目錄并不存在,但rsync命令仍會執(zhí)行成功,不會報錯
所以首次執(zhí)行是只參照備份的源目錄SOURCE_DIR進(jìn)行的備份,即全量備份,目錄目錄下都是全新的文件
首次執(zhí)行完畢后,會將最新一次備份的成果TARGET_DIR鏈接成基準(zhǔn)目錄,這樣下一次執(zhí)行rsync就有了基準(zhǔn)目錄
2、第二次執(zhí)行該腳本
此時執(zhí)行腳本時,用戶可能已經(jīng)改動了源目錄里的內(nèi)容(新增了文件或者改動了某個文件)
所以此刻的源目錄跟當(dāng)初的源目錄依然不同了,如果找到這個不同呢?這就用到了上一次備份留給我們的基準(zhǔn)目錄,即
SOURCE_DIR + 上一次備份留給我們的基準(zhǔn)目錄LATEST_LINK ===》得出增量
然后將增量備份到一個新的目標(biāo)目錄,目標(biāo)目錄以當(dāng)前時間命名
注意注意注意,此時的目標(biāo)目錄擁有與當(dāng)前源目錄一模一樣的文件,但實(shí)際上,這些文件中,只有那些變動過的文件是剛剛新建/備份到該目錄中的,其他沒有變動的文件都是直接指向基準(zhǔn)目錄文件的硬鏈接而不是重新拷貝了一份。
所以,因為采用的是硬鏈接,基于rsync的增量備份在恢復(fù)數(shù)據(jù)時,只需要去/egon/backups找對應(yīng)時間的目錄即可,那里面每個目錄里存放的就是對應(yīng)時間節(jié)點(diǎn)的所有數(shù)據(jù)
刪除上一次的基準(zhǔn)目錄,然后將當(dāng)前剛剛備份好的、最新的目標(biāo)目錄鏈接成新的基準(zhǔn)目錄,為下一次增量做好準(zhǔn)備
3、第三次執(zhí)行該腳本
同上,都是增量

總結(jié)

# 1、首次執(zhí)行為全量
# 2、后續(xù)執(zhí)行為增量,后續(xù)的每次備份產(chǎn)生的以時間命名的目標(biāo)目錄TARGET_DIR都代表著當(dāng)前的最新狀態(tài),但舊的、未曾改動的文件都是指向上一次備份的TARGET_DIR
# 3、數(shù)據(jù)恢復(fù)時,只需要找到對應(yīng)時間的目標(biāo)目錄即可,那里面每個目錄里存放的就是對應(yīng)時間節(jié)點(diǎn)的所有數(shù)據(jù),無需按照傳統(tǒng)的增量恢復(fù)->先恢復(fù)全量,再依次恢復(fù)每次增量一直到當(dāng)前想要的時間節(jié)點(diǎn)

本文摘自 :https://blog.51cto.com/u

開通會員,享受整站包年服務(wù)立即開通 >