Linux下Rsync和Tar增量備份梳理


 

前面總結過一篇全量備份/增量備份/差異備份說明,下面介紹下linux下rsync和tar兩種增量備份的操作記錄:

1)rsync備份
rsync由於本身的特性,在第一次rsync備份后,以后每次都只是傳內容有改變的部分,而不是全部傳。所以,rsync在做鏡像方面是很不錯的,只傳增量,節省帶寬、時間。
常規本地rsync備份命令可以是:
# rsync -az --delete SRC DST
其中:
-z 壓縮
-a 簡單理解就是保持一致性
--delete 嚴格保證DST內容與SRC一致,即DST中SRC沒有的文件會被刪除掉   (--delete-before表示在進行同步之前,先將目標目錄全部刪除,然后再進行同步操作)
 
實例如下:
[root@linux-node3 mnt]# mkdir test
[root@linux-node3 mnt]# cd test/
[root@linux-node3 mnt]# ls
test
[root@linux-node3 test]# echo "a1" > a1.txt
[root@linux-node3 test]# echo "a2" > a2.txt
[root@linux-node3 test]# echo "a3" > a3.txt
[root@linux-node3 test]# ls
a1.txt  a2.txt  a3.txt  aaa
 
現在使用rsync進行增量備份
[root@linux-node3 mnt]# rsync -az --delete test /opt/
[root@linux-node3 mnt]# ls /opt/
test
[root@linux-node3 mnt]# ls /opt/
test  wang
[root@linux-node3 mnt]# rsync -az --delete test /opt/
[root@linux-node3 mnt]# ls /opt/
test  wang
[root@linux-node3 mnt]# ls /opt/test/
a1.txt  a2.txt  a3.txt  a4  aaa
 
注意:
--delete參數要放在源目錄和目標目錄前,並且兩個目錄結構一定要一致!不能使用./*。
如果目錄結構不一致,則不會刪除目標目錄中的目錄。如上,/opt/wang目錄由於目錄結構不一致,故它是多余的但不刪除。
 
現在進行增量備份,rsync在第一次同步后,后面就只同步內容有改變的部分
 
溫馨提示:
rsync使用--delete參數,在做增量方式的全備份可以說是最佳選擇。但這樣只有一個副本,也就是說如果你想查以前某個時間段的數據,是沒法查到的。
 
2)tar打包備份
tar的備份就是把文件打包起來,保存到其他地方,可以滿足查檔要求,也即上面說到的。
再配合crontab,就可以實現定時增量備份
 
下面說說tar的三種增量備份方式:
------------------------------------------------------------------------------------------------
a)第一種方式:tar -g snapshot方法
利用tar -g參數,在第一次備份時候生成時間戳文件,里面包含指定備份目錄下的所有文件的一個時間戳,下次增量備份,tar會利用時間戳文件去比較,只有那些內容在這段時間有修改的文件,才會被打包。
 
實例說明:
[root@linux-node3 mnt]# ls
[root@linux-node3 mnt]# mkdir test
[root@linux-node3 mnt]# echo "123" > test/test1
[root@linux-node3 mnt]# echo "123123" > test/test2
[root@linux-node3 mnt]# mkdir test/aaa
[root@linux-node3 mnt]# ls test/
aaa  test1  test2
 
先執行完整備份
[root@linux-node3 mnt]# tar -g snapshot -zcf backup_full.tar.gz test
[root@linux-node3 mnt]# ls
aaa  backup_full.tar.gz  snapshot  test
[root@linux-node3 mnt]# cat snapshot
GNU tar-1.23-2
1490172505723210801014901724572030064696476940641test/aaa014901724572030064696476940639testDaaaYtest1Ytest2
 
接下來進行差異和增量備份操作:
增加數據
[root@linux-node3 mnt]# echo "aaaaa" >> test/test1
[root@linux-node3 mnt]# echo "aaaaa11111" >> test/test3
[root@linux-node3 mnt]# ls test/
aaa  test1  test2  test3
 
執行第一次的增量備份 (注意tarball檔名)
[root@linux-node3 mnt]# tar -g snapshot -zcf backup_incremental_1.tar.gz test
[root@linux-node3 mnt]# ls
aaa  backup_full.tar.gz  backup_incremental_1.tar.gz  snapshot  test
[root@linux-node3 mnt]# cat snapshot
GNU tar-1.23-2
1490172606339019504014901724572030064696476940641test/aaa014901725622320064796476940639testDaaaYtest1Ntest2Ytest3
 
再增加差異數據
[root@linux-node3 mnt]# echo "77777" > test/test1
[root@linux-node3 mnt]# echo "6666" >> test/test2
[root@linux-node3 mnt]# touch test/aaaa
[root@linux-node3 mnt]# ls test/
aaa  aaaa  test1  test2  test3
 
執行第二次的增量備份
[root@linux-node3 mnt]# tar -g snapshot -zcf backup_incremental_2.tar.gz test
[root@linux-node3 mnt]# ls
aaa  backup_full.tar.gz  backup_incremental_2.tar.gz  backup_incremental_1.tar.gz  snapshot  test
[root@linux-node3 mnt]# cat snapshot
GNU tar-1.23-2
149017272274896944014901724572030064696476940641test/aaa014901726931200065246476940639testDaaaYaaaaYtest1Ytest2Ntest3
 
現在進行測試,刪除測試數據test
[root@linux-node3 mnt]# rm -rf test/
[root@linux-node3 mnt]# ls
aaa  backup_full.tar.gz  backup_incremental_2.tar.gz  backup_incremental_1.tar.gz  snapshot
 
開始進行數據還原
恢復第一次全備份的數據
[root@linux-node3 mnt]# tar zxf backup_full.tar.gz
[root@linux-node3 mnt]# ls
aaa  backup_full.tar.gz  backup_incremental_2.tar.gz  backup_incremental_1.tar.gz  snapshot  test
[root@linux-node3 mnt]# ls test/
aaa  test1  test2
[root@linux-node3 mnt]# cat test/test1
123
 
恢復第一次增量備份的數據
[root@linux-node3 mnt]# tar zxf backup_incremental_1.tar.gz
[root@linux-node3 mnt]# ls test/
aaa  test1  test2  test3
[root@linux-node3 mnt]# cat test/test1
123
aaaaa
[root@linux-node3 mnt]# cat test/test3
aaaaa11111
 
恢復第二次增量備份的數據
[root@linux-node3 mnt]# tar zxf backup_incremental_2.tar.gz
[root@linux-node3 mnt]# ls test/
aaa  aaaa  test1  test2  test3
[root@linux-node3 mnt]# cat test/test1
77777
[root@linux-node3 mnt]# cat test/test2
123123
6666
 
最后可以結合crontab實現定時增量備份
第一次手動進行全備份,生成snapshot時間戳文件,后面寫增量備份腳本
[root@linux-node3 ~]# vim  backup_incremental.sh
#!/bin/bash
DATE=`date +%Y%m%d%H%M%S`
/bin/tar -g /mnt/snapshot -zcf /mnt/backup_incremental_$DATE.tar.gz /mnt/test
 
進行定時增量備份操作
[root@linux-node3 ~]# crontab -e
#每小時進行一次增量備份
0 * * * * /bin/bash -x /root/backup_incremental.sh > /dev/null 2>&1
 
從上面可以看出:
snapshot作為時間戳文件,它記錄備份目錄里面每個文件的一個當前修改時間,只要下次備份時候,再利用-g ~/snapshot指定上次生成的時間戳文件就可以實現增量備份!
 
可能出現下面兩種問題:
-->  snapshot時間戳文件是每次增量備份完成時候更新的,如果在兩次備份間隔間,由於io問題,上次備份沒完成,第二次增量備份就開始的話,
就有可能出現,第二次增量備份並不是一個備份間隔有修改過的文件,而是兩次;如果IO問題一直存在,就會一直累積備份,最后系統超負載,性能變得極差
 
--> 上次備份失敗(意外終止)
這樣的情況,要看是在什么時候終止,因為tar命令在增量備份時候會先掃一遍文件,比較修改時間,因此,有可能備份進程意外終止后,導致時間戳文件清空,下次增量備份就變成全備了,嚴重影響備份策略!

--------------------------------------------------------------------------
b)第二種方式:tar -g tarinfo增量備份方法
只需要指定-g參數,tarinfo文件則是用來記錄備份的一些信息

1)創建備份測試目錄wang
[root@zabbix-server opt]# pwd
/opt
[root@zabbix-server opt]# echo "1111" > wang/1.txt
[root@zabbix-server opt]# echo "2222" > wang/2.txt
[root@zabbix-server opt]# echo "3333" > wang/3.txtwang
[root@zabbix-server opt]# ls wang/
1.txt  2.txt  3.txt  

2)進行完整備份
[root@zabbix-server opt]# tar -g tarinfo -czf backup-full.tar.gz wang/
[root@zabbix-server opt]# ls
backup-full.tar.gz  tarinfo  wang

3)新增文件
[root@zabbix-server opt]# echo "4444" > wang/4.txt
[root@zabbix-server opt]# echo "12121" >> wang/1.txt

4)進行增量備份
[root@zabbix-server opt]# tar -g tarinfo -czf backup-incre1.tar.gz wang/
[root@zabbix-server opt]# ls
backup-full.tar.gz  backup-incre1.tar.gz  tarinfo  wang
[root@zabbix-server opt]# cat tarinfo 
GNU tar-1.23-2
1508989798794775692015089897819623314720538519682wangY1.txtN2.txtN3.txtY4.txt

5)刪除wang目錄,進行恢復(先全量恢復,再增量恢復)
[root@zabbix-server opt]# rm -rf wang
[root@zabbix-server opt]# ls
backup-full.tar.gz  backup-incre1.tar.gz  tarinfo
[root@zabbix-server opt]# tar -zvxf backup-full.tar.gz 
wang/
wang/1.txt
wang/2.txt
wang/3.txt
[root@zabbix-server opt]# ls wang/
1.txt  2.txt  3.txt
[root@zabbix-server opt]# cat wang/1.txt 
1111
[root@zabbix-server opt]# tar -zvxf backup-incre1.tar.gz 
wang/
wang/1.txt
wang/4.txt
[root@zabbix-server opt]# ls wang/
1.txt  2.txt  3.txt  4.txt
[root@zabbix-server opt]# cat wang/1.txt 
1111
12121

--------------------------------------------------------------------------
c)第三種方式:
還是覺得tar -g snapshot最大的問題就是不可控,而且穩定性較差,出現備份重疊時候很難處理好。
因此,可以利用find+tar來做增量備份的想法。利用find命令找出最近修改的文件名列表,然后再利用tar打包
 
實例如下:
[root@linux-node3 ~]# ls /mnt/
test
[root@linux-node3 ~]# ls /mnt/test/
aaa  aaaa  test1  test2  test3
 
備份/mnt/test目錄下30分鍾以內修改的文件
先使用find命令列出最近有修改的文件名列表,保存到文件
[root@linux-node3 ~]# find /mnt/test -mmin -30 -type f >> /mnt/listfile
[root@linux-node3 ~]# ls /mnt/
listfile  test
[root@linux-node3 ~]# cat /mnt/listfile
/mnt/test/test2
/mnt/test/aaaa
/mnt/test/test1
 
然后使用tar命令對文件列表列出的文件名進行打包備份
[root@linux-node3 ~]# tar -zcf test.tgz -T /mnt/listfile
tar: Removing leading `/' from member names
[root@linux-node3 ~]# ls /mnt
listfile        test.tgz            test
 
同理備份/mnt/test目錄下1天之內修改的數據
[root@linux-node3 ~]# find /mnt/test  -mtime -1 -type f >> /mnt/listfile2
[root@linux-node3 ~]# tar -zcf test2.tgz -T /mnt/listfile2
 
這樣恢復的時候,需要恢復到哪個階段的數據,就利用這個階段備份的打包文件進行恢復即可!
 
這種方式來做增量備份,即使某個時間段機器性能很差,備份重疊,也不會影響到各自的備份進程。
此外,find命令生成的文件list,還可以方便以后查檔,直接對list搜索指定文件,不用去tar查看。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM