本文最后更新于 396 天前,其中的信息可能已经过时,如有错误请发送邮件到 wuxianglongblog@163.com
rsync 由于本身的特性,在第一次 rsync 备份后,以后每次都只是传内容有改变的部分,而不是全部传。所以,rsync 在做镜像方面是很不错的,只传增量,节省带宽、时间。
常规本地 rsync 备份命令可以是:
| rsync -az --delete SRC DST |
| |
| 其中: |
| -z 压缩 |
| -a 简单理解就是保持一致性 |
| --delete 严格保证DST内容与SRC一致,即DST中SRC没有的文件会被删除掉 (--delete-before表示在进行同步之前,先将目标目录全部删除,然后再进行同步操作) |
实例如下:
| [root@linux-node3 mnt] |
| [root@linux-node3 mnt] |
| [root@linux-node3 mnt] |
| test |
| [root@linux-node3 test] |
| [root@linux-node3 test] |
| [root@linux-node3 test] |
| [root@linux-node3 test] |
| a1.txt a2.txt a3.txt aaa |
现在使用 rsync 进行增量备份
| [root@linux-node3 mnt] |
| [root@linux-node3 mnt] |
| test |
| [root@linux-node3 mnt] |
| test wang |
| [root@linux-node3 mnt] |
| [root@linux-node3 mnt] |
| test wang |
| [root@linux-node3 mnt] |
| a1.txt a2.txt a3.txt a4 aaa |
注意:
--delete 参数要放在源目录和目标目录前,并且两个目录结构一定要一致!不能使用./*。
如果目录结构不一致,则不会删除目标目录中的目录。如上,/opt/wang 目录由于目录结构不一致,故它是多余的但不删除。
现在进行增量备份,rsync 在第一次同步后,后面就只同步内容有改变的部分
温馨提示:
rsync 使用 --delete 参数,在做增量方式的全备份可以说是最佳选择。但这样只有一个副本,也就是说如果你想查以前某个时间段的数据,是没法查到的。
tar 的备份就是把文件打包起来,保存到其他地方,可以满足查档要求,也即上面说到的。
再配合 crontab,就可以实现定时增量备份
利用 tar -g 参数,在第一次备份时候生成时间戳文件,里面包含指定备份目录下的所有文件的一个时间戳,下次增量备份,tar 会利用时间戳文件去比较,只有那些内容在这段时间有修改的文件,才会被打包。
实例说明:
| [root@linux-node3 mnt] |
| [root@linux-node3 mnt] |
| [root@linux-node3 mnt] |
| [root@linux-node3 mnt] |
| [root@linux-node3 mnt] |
| [root@linux-node3 mnt] |
| 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] |
| [root@linux-node3 mnt] |
| [root@linux-node3 mnt] |
| 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] |
| [root@linux-node3 mnt] |
| [root@linux-node3 mnt] |
| [root@linux-node3 mnt] |
| 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] |
| [root@linux-node3 mnt] |
| aaa test1 test2 test3 |
| [root@linux-node3 mnt] |
| 123 |
| aaaaa |
| [root@linux-node3 mnt] |
| aaaaa11111 |
恢复第二次增量备份的数据
| [root@linux-node3 mnt] |
| [root@linux-node3 mnt] |
| aaa aaaa test1 test2 test3 |
| [root@linux-node3 mnt] |
| 77777 |
| [root@linux-node3 mnt] |
| 123123 |
| 6666 |
最后可以结合 crontab 实现定时增量备份
第一次手动进行全备份,生成 snapshot 时间戳文件,后面写增量备份脚本
| [root@linux-node3 ~] |
| |
| DATE=`date +%Y%m%d%H%M%S` |
| /bin/tar -g /mnt/snapshot -zcf /mnt/backup_incremental_$DATE.tar.gz /mnt/test |
进行定时增量备份操作
| 0 * * * * /bin/bash -x /root/backup_incremental.sh > /dev/null 2>&1 |
从上面可以看出:
snapshot 作为时间戳文件,它记录备份目录里面每个文件的一个当前修改时间,只要下次备份时候,再利用 - g ~/snapshot 指定上次生成的时间戳文件就可以实现增量备份!
可能出现下面两种问题:
--> snapshot 时间戳文件是每次增量备份完成时候更新的,如果在两次备份间隔间,由于 io 问题,上次备份没完成,第二次增量备份就开始的话,
就有可能出现,第二次增量备份并不是一个备份间隔有修改过的文件,而是两次;如果 IO 问题一直存在,就会一直累积备份,最后系统超负载,性能变得极差
--> 上次备份失败(意外终止)
这样的情况,要看是在什么时候终止,因为 tar 命令在增量备份时候会先扫一遍文件,比较修改时间,因此,有可能备份进程意外终止后,导致时间戳文件清空,下次增量备份就变成全备了,严重影响备份策略!
只需要指定 - 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] |
| [root@zabbix-server opt] |
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 |
还是觉得 tar -g snapshot 最大的问题就是不可控,而且稳定性较差,出现备份重叠时候很难处理好。
因此,可以利用 find+tar 来做增量备份的想法。利用 find 命令找出最近修改的文件名列表,然后再利用 tar 打包
实例如下:
| [root@linux-node3 ~] |
| test |
| [root@linux-node3 ~] |
| aaa aaaa test1 test2 test3 |
备份 /mnt/test 目录下 30 分钟以内修改的文件
先使用 find 命令列出最近有修改的文件名列表,保存到文件
| [root@linux-node3 ~] |
| [root@linux-node3 ~] |
| listfile test |
| [root@linux-node3 ~] |
| /mnt/test/test2 |
| /mnt/test/aaaa |
| /mnt/test/test1 |
然后使用 tar 命令对文件列表列出的文件名进行打包备份
| [root@linux-node3 ~] |
| tar: Removing leading `/' from member names |
| [root@linux-node3 ~] |
| listfile test.tgz test |
同理备份 /mnt/test 目录下 1 天之内修改的数据
| [root@linux-node3 ~] |
| [root@linux-node3 ~] |
这样恢复的时候,需要恢复到哪个阶段的数据,就利用这个阶段备份的打包文件进行恢复即可!
这种方式来做增量备份,即使某个时间段机器性能很差,备份重叠,也不会影响到各自的备份进程。
此外,find 命令生成的文件 list,还可以方便以后查档,直接对 list 搜索指定文件,不用去 tar 查看。