linux下rsync和tar增量备份梳理

 

前面总结过一篇全量备份/增量备份/差别备份说明,下面介绍下linux下rsync和tar两种增量备份的操做记录:html

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查看。
相关文章
相关标签/搜索