rsyc 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 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
查看。