前面總結過一篇全量備份/增量備份/差異備份說明,下面介紹下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檢視。