增量備份(incremental backup)是備份的一個(gè)類型,是指在一次全備份或上一次增量備份后,以后每次的備份只需備份與前一次相比增加或者被修改的文件。
五 增量備份
rsync 的最大特點(diǎn)就是它可以完成增量備份, 除了源目錄與目標(biāo)目錄直接比較,rsync還支持使用--link-dest參數(shù)用來(lái)指定同步時(shí)的基準(zhǔn)目錄,即將源目錄與基準(zhǔn)目錄之間變動(dòng)的部分,同步到目標(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)行比較,找出變動(dòng)的文件,將它們拷貝到目標(biāo)目錄/target/path。
那些沒(méi)變動(dòng)的文件則會(huì)生成硬鏈接,硬鏈接指向上一個(gè)/target/path中的文件。這個(gè)命令的第一次備份時(shí)是全量備份,后面就都是增量備份了。
例
[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的每次增量都會(huì)保留源目錄中的全部文件,但是若文件較之上一次沒(méi)有變化,則新備份中的文件只是創(chuàng)建了一個(gè)指向上一次對(duì)應(yīng)文件的硬鏈接,這就保證了在不浪費(fèi)空間的前提下保證了rsync的增量備份在恢復(fù)數(shù)據(jù)時(shí),只需要找到一份備份既可以恢復(fù)到指定的狀態(tài),這就使得其數(shù)據(jù)恢復(fù)過(guò)程的簡(jiǎn)潔性與完全備份一樣了,但它還比全量備份的數(shù)據(jù)量要小很多。 下面是一個(gè)腳本示例,備份/opt目錄。
# A script to perform incremental backups using rsync
set -o errexit # 它使得腳本只要發(fā)生錯(cuò)誤,就終止執(zhí)行,而不是一聲不響地往下執(zhí)行
set -o nounset # 在shell中,遇到變量不存在,并不會(huì)報(bào)錯(cuò),而是輸出空,然后繼續(xù)執(zhí)行后續(xù)代碼
# 開啟nounset選項(xiàng)后,腳本若碰到變量為定義則報(bào)錯(cuò)并終止運(yùn)行
set -o pipefail # 上面的選項(xiàng)errexit針對(duì)管道命令是無(wú)效的,比如xxx | echo "egon",并不存在
# xxx命令,但是該管道命令整體是執(zhí)行成功的,加上pipefail選項(xiàng)后則可以防止這件事
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命令仍會(huì)執(zhí)行成功,不會(huì)報(bào)錯(cuò)
所以首次執(zhí)行是只參照備份的源目錄SOURCE_DIR進(jìn)行的備份,即全量備份,目錄目錄下都是全新的文件
首次執(zhí)行完畢后,會(huì)將最新一次備份的成果TARGET_DIR鏈接成基準(zhǔn)目錄,這樣下一次執(zhí)行rsync就有了基準(zhǔn)目錄
2、第二次執(zhí)行該腳本
此時(shí)執(zhí)行腳本時(shí),用戶可能已經(jīng)改動(dòng)了源目錄里的內(nèi)容(新增了文件或者改動(dòng)了某個(gè)文件)
所以此刻的源目錄跟當(dāng)初的源目錄依然不同了,如果找到這個(gè)不同呢?這就用到了上一次備份留給我們的基準(zhǔn)目錄,即
SOURCE_DIR + 上一次備份留給我們的基準(zhǔn)目錄LATEST_LINK ===》得出增量
然后將增量備份到一個(gè)新的目標(biāo)目錄,目標(biāo)目錄以當(dāng)前時(shí)間命名
注意注意注意,此時(shí)的目標(biāo)目錄擁有與當(dāng)前源目錄一模一樣的文件,但實(shí)際上,這些文件中,只有那些變動(dòng)過(guò)的文件是剛剛新建/備份到該目錄中的,其他沒(méi)有變動(dòng)的文件都是直接指向基準(zhǔn)目錄文件的硬鏈接而不是重新拷貝了一份。
所以,因?yàn)椴捎玫氖怯叉溄?,基于rsync的增量備份在恢復(fù)數(shù)據(jù)時(shí),只需要去/egon/backups找對(duì)應(yīng)時(shí)間的目錄即可,那里面每個(gè)目錄里存放的就是對(duì)應(yīng)時(shí)間節(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)生的以時(shí)間命名的目標(biāo)目錄TARGET_DIR都代表著當(dāng)前的最新?tīng)顟B(tài),但舊的、未曾改動(dòng)的文件都是指向上一次備份的TARGET_DIR
# 3、數(shù)據(jù)恢復(fù)時(shí),只需要找到對(duì)應(yīng)時(shí)間的目標(biāo)目錄即可,那里面每個(gè)目錄里存放的就是對(duì)應(yīng)時(shí)間節(jié)點(diǎn)的所有數(shù)據(jù),無(wú)需按照傳統(tǒng)的增量恢復(fù)->先恢復(fù)全量,再依次恢復(fù)每次增量一直到當(dāng)前想要的時(shí)間節(jié)點(diǎn)
本文摘自 :https://blog.51cto.com/u