linux下rsync和tar增量备份梳理

简介:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
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 查看。
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************

本文转自散尽浮华博客园博客,原文链接:http://www.cnblogs.com/kevingrace/p/6601088.html,如需转载请自行联系原作者
相关文章
|
23天前
|
存储 安全 Linux
《Linux 简易速速上手小册》第9章: 备份与恢复策略(2024 最新版)
《Linux 简易速速上手小册》第9章: 备份与恢复策略(2024 最新版)
31 1
|
1月前
|
关系型数据库 MySQL Linux
linux下mysql定时备份
linux下mysql定时备份
32 0
|
2月前
|
Shell Linux 编译器
【Shell 命令集合 备份压缩 】Linux 提取zip压缩文件的详细信息 zipinfo命令 使用指南
【Shell 命令集合 备份压缩 】Linux 提取zip压缩文件的详细信息 zipinfo命令 使用指南
41 0
|
1月前
|
关系型数据库 MySQL Linux
Linux系统使用定时脚本备份mysql
Linux系统使用定时脚本备份mysql
|
13天前
|
存储 算法 Linux
3分钟带你快速学会Linux tar 命令
【4月更文挑战第24天】
30 1
3分钟带你快速学会Linux tar 命令
|
1月前
|
算法 Linux
Linux指令|压缩文件|zip|tar
Linux指令|压缩文件|zip|tar
|
2月前
|
Linux
玩转Linux必不可少的命令之tar
`tar`命令具有丰富的选项和用法,是在Linux中进行文件归档、压缩和备份的重要工具之一。
133 0
|
2月前
|
安全 搜索推荐 Linux
Linux C++ 环境下数据高效备份策略:全面指南与最佳实践
Linux C++ 环境下数据高效备份策略:全面指南与最佳实践
37 1
|
2月前
|
存储 Shell Linux
【Shell 命令集合 备份压缩 】Linux 将二进制文件转换为ASCII码 uuencode命令 使用指南
【Shell 命令集合 备份压缩 】Linux 将二进制文件转换为ASCII码 uuencode命令 使用指南
39 0