赞
踩
这篇文章主要介绍一下svn的常用的备份/恢复方案。
使用操作系统的命令cp或者tar命令进行备份。备份时如果仍有用户进行svn相关的提交或者修改操作,可能会导致备份数据的完整性出现问题,所以整体建议停止svn服务以及用户没有对svn进行操作的前提下进行备份。
限制在于需要停止svn服务,以及无法进行增量备份,而且数据可能会由于不完整性会导致数据导入出现问题,所以不是推荐的方式,可以作为结合方式之一。
svnadmin提供dump子命令进行数据的备份。同时根据参数的设定可以进行全量备份和增量备份。
设定项 | 缩写 | 说明 |
---|---|---|
–revision | -r | 指定版本或者版本范围(或rev1:rev2范围) |
–incremental | - | 指定增量方式 |
–deltas | - | 在dump文件中使用deltas方式,这种方式不会保留文件所有内容而只是修改部分,对dump文件大小的控制有较好的效果,但是在导出的时候需要更多的资源 |
–quiet | -q | 安静模式:标准错误中进显示错误不输出进度信息 |
如下给出全备份的执行例
/data/svn # time -p svnadmin dump demo-repo >full-dump.01
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.
* Dumped revision 4.
* Dumped revision 5.
* Dumped revision 6.
* Dumped revision 7.
* Dumped revision 8.
* Dumped revision 9.
* Dumped revision 10.
* Dumped revision 11.
* Dumped revision 12.
* Dumped revision 13.
* Dumped revision 14.
real 0.01
user 0.00
sys 0.00
/data/svn # du -k full-dump.01
8 full-dump.01
/data/svn #

也可以添加上quiet参数
/data/svn # time -p svnadmin dump --quiet demo-repo >full-dump.02
real 0.00
user 0.00
sys 0.00
/data/svn # diff full-dump.01 full-dump.02
/data/svn #
设定incremental参数和-r参数可以进行增量备份
/data/svn # time -p svnadmin dump -r 0:8 --incremental demo-repo >incremental_8
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.
* Dumped revision 4.
* Dumped revision 5.
* Dumped revision 6.
* Dumped revision 7.
* Dumped revision 8.
real 0.00
user 0.00
sys 0.00
/data/svn # time -p svnadmin dump -r 9:14 --incremental demo-repo >incremental_14
* Dumped revision 9.
* Dumped revision 10.
* Dumped revision 11.
* Dumped revision 12.
* Dumped revision 13.
* Dumped revision 14.
real 0.00
user 0.00
sys 0.00
/data/svn #
/data/svn # du -k incremental_14 incremental_8
4 incremental_14
4 incremental_8
/data/svn #

deltas方式的大小确认:
/data/svn # time -p svnadmin dump --deltas demo-repo >full_deltas.03
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.
* Dumped revision 4.
* Dumped revision 5.
* Dumped revision 6.
* Dumped revision 7.
* Dumped revision 8.
* Dumped revision 9.
* Dumped revision 10.
* Dumped revision 11.
* Dumped revision 12.
* Dumped revision 13.
* Dumped revision 14.
real 0.01
user 0.00
sys 0.00
/data/svn #

在总量较小的情况看不出太大的区别,只是略小。
/data/svn # ls -l
total 32
drwxr-xr-x 6 root root 86 Aug 25 00:03 demo-repo
-rw-r--r-- 1 root root 6292 Aug 26 16:12 full-dump.01
-rw-r--r-- 1 root root 6292 Aug 26 16:13 full-dump.02
-rw-r--r-- 1 root root 6926 Aug 26 16:23 full_deltas.03
-rw-r--r-- 1 root root 2666 Aug 26 16:17 incremental_14
-rw-r--r-- 1 root root 3701 Aug 26 16:17 incremental_8
/data/svn #
svnadmin dump是推荐的备份方式,可以进行全量备份和增量备份,非常灵活。但是随着数据量的增大,保存的时间可能会较长。
使用svnadmin hotcopy可以进行全量的备份,速度也比较快。新的版本现在也已经支持增量备份。增量备份的使用与dump类似,这里不再验证。
设定项 | 缩写 | 说明 |
---|---|---|
–clean-logs | - | 删除冗余的Berkeley日志文件 |
–incremental | - | 指定增量方式 |
可以看到备份的目标是会生成一个目录,会将一致性的数据拷贝至full_hotcopy.01目录下,此目录会在执行时创建
/data/svn # time -p svnadmin hotcopy demo-repo /tmp/full_hotcopy.01
* Copied revision 0.
* Copied revision 1.
* Copied revision 2.
* Copied revision 3.
* Copied revision 4.
* Copied revision 5.
* Copied revision 6.
* Copied revision 7.
* Copied revision 8.
* Copied revision 9.
* Copied revision 10.
* Copied revision 11.
* Copied revision 12.
* Copied revision 13.
* Copied revision 14.
real 0.03
user 0.00
sys 0.01
/data/svn #
/data/svn # ls /tmp/full_hotcopy.01
README.txt conf db format hooks locks
/data/svn # du -k /tmp/full_hotcopy.01
36 /tmp/full_hotcopy.01/hooks
20 /tmp/full_hotcopy.01/conf
8 /tmp/full_hotcopy.01/locks
60 /tmp/full_hotcopy.01/db/revs/0
60 /tmp/full_hotcopy.01/db/revs
60 /tmp/full_hotcopy.01/db/revprops/0
60 /tmp/full_hotcopy.01/db/revprops
0 /tmp/full_hotcopy.01/db/transactions
0 /tmp/full_hotcopy.01/db/txn-protorevs
4 /tmp/full_hotcopy.01/db/locks/666
4 /tmp/full_hotcopy.01/db/locks/854
4 /tmp/full_hotcopy.01/db/locks/27f
4 /tmp/full_hotcopy.01/db/locks/482
16 /tmp/full_hotcopy.01/db/locks
184 /tmp/full_hotcopy.01/db
256 /tmp/full_hotcopy.01
/data/svn #

/data/svn # time -p svnadmin hotcopy demo-repo /tmp/full_hotcopy.02 --clean-logs
* Copied revision 0.
* Copied revision 1.
* Copied revision 2.
* Copied revision 3.
* Copied revision 4.
* Copied revision 5.
* Copied revision 6.
* Copied revision 7.
* Copied revision 8.
* Copied revision 9.
* Copied revision 10.
* Copied revision 11.
* Copied revision 12.
* Copied revision 13.
* Copied revision 14.
real 0.04
user 0.00
sys 0.01
/data/svn #
/data/svn # du -k /tmp/full_hotcopy.02
36 /tmp/full_hotcopy.02/hooks
20 /tmp/full_hotcopy.02/conf
8 /tmp/full_hotcopy.02/locks
60 /tmp/full_hotcopy.02/db/revs/0
60 /tmp/full_hotcopy.02/db/revs
60 /tmp/full_hotcopy.02/db/revprops/0
60 /tmp/full_hotcopy.02/db/revprops
0 /tmp/full_hotcopy.02/db/transactions
0 /tmp/full_hotcopy.02/db/txn-protorevs
4 /tmp/full_hotcopy.02/db/locks/666
4 /tmp/full_hotcopy.02/db/locks/854
4 /tmp/full_hotcopy.02/db/locks/27f
4 /tmp/full_hotcopy.02/db/locks/482
16 /tmp/full_hotcopy.02/db/locks
184 /tmp/full_hotcopy.02/db
256 /tmp/full_hotcopy.02
/data/svn #

svnadmin hotcopy可以进行全量和增量的备份。虽然整体速度较快,但是当数据量大的时候,整体的时间花费会较多,而且所需的存储也会多一些。
严格来说svnsync就不是一个备份的方式,而是像它的名字那样是用于两个库之间做同步的。所以实际的使用场景更多是HA的高可用性,svn是典型的集中式版本管理工具,一旦svn服务down掉,对开发的影响是巨大的,如果能够有接近实时的Standby-Active的双机构成,对提供稳定的服务是很有效的。在实际的使用中,与其创建一个全公司公用的不能停止的svn服务,更多的是使用不同分散的svn仓库的服务。
详细关于如何设定双机构成的svn服务,鉴于篇幅,会在其他的章节进行介绍。
svnsync需要更多的资源,并且其往往会有已定的延迟,一旦出现故障可以像双机热备那样进行fail over,但是当主svn服务恢复的时候,如何进行failback也需要额外的考虑。所以往往需要结合其他几种备份机制进行管理,一般用于提供不能中断的大型的集中式的svn服务。
使用操作系统的命令cp或者tar命令进行的备份。在恢复的时候直接将数据覆盖即可。就像备份时出现的问题一样:恢复时如果仍有用户进行svn相关的提交或者修改操作,也可能会导致恢复的出现问题,所以整体建议停止svn服务以及用户没有对svn进行操作的前提下进行恢复。
限制在于需要停止svn服务,以及无法进行增量恢复,而且数据可能会由于不完整性会导致数据导入出现问题,所以不是推荐的方式,可以作为结合方式之一。
使用svnadmin dump备份的方式,可以使用svnadmin load来进行恢复
设定项 | 缩写 | 说明 |
---|---|---|
–revision | -r | 指定版本或者版本范围(或rev1:rev2范围) |
–quiet | -q | 安静模式:标准错误中进显示错误不输出进度信息 |
不使用参数,使用dump生成的全量备份文件进行恢复
使用create生成备份库,这里为了演示,在同一个svn多仓库服务下,创建一个新的仓库用于恢复
/data/svn # svnadmin create repo-restore
/data/svn # svnadmin load repo-restore <full-dump.01
<<< Started new transaction, based on original revision 1
* editing path : first-svn-file ... done.
------- Committed revision 1 >>>
<<< Started new transaction, based on original revision 2
* editing path : branches ... done.
* editing path : tags ... done.
* editing path : trunk ... done.
------- Committed revision 2 >>>
<<< Started new transaction, based on original revision 3
* editing path : trunk/trunk-file ... done.
------- Committed revision 3 >>>
<<< Started new transaction, based on original revision 4
* editing path : branches/feature_script ...COPIED... done.
------- Committed revision 4 >>>
<<< Started new transaction, based on original revision 5
* editing path : branches/feature_script/feature_script.sh ... done.
------- Committed revision 5 >>>
<<< Started new transaction, based on original revision 6
* editing path : tags/release-script-1.0 ...COPIED... done.
------- Committed revision 6 >>>
<<< Started new transaction, based on original revision 7
* editing path : trunk ... done.
* editing path : trunk/feature_script.sh ...COPIED... done.
------- Committed revision 7 >>>
<<< Started new transaction, based on original revision 8
* editing path : tags/release-script-1.1 ...COPIED... done.
------- Committed revision 8 >>>
<<< Started new transaction, based on original revision 9
* editing path : trunk/feature_script.sh ... done.
------- Committed revision 9 >>>
<<< Started new transaction, based on original revision 10
* editing path : trunk/feature_script.sh ... done.
------- Committed revision 10 >>>
<<< Started new transaction, based on original revision 11
* editing path : trunk/feature_script.sh ... done.
------- Committed revision 11 >>>
<<< Started new transaction, based on original revision 12
* editing path : trunk/feature_script.sh ... done.
------- Committed revision 12 >>>
<<< Started new transaction, based on original revision 13
* editing path : tags/release-script-1.0 ... done.
------- Committed revision 13 >>>
<<< Started new transaction, based on original revision 14
* editing path : branches/feature_script/feature_script.sh ... done.
------- Committed revision 14 >>>
/data/svn #

/data/svn # cp demo-repo/conf/* repo-restore/conf/
/data/svn #
不使用参数,使用dump生成的增量备份文件进行恢复
使用create生成备份库,这里为了演示,在同一个svn多仓库服务下,创建一个新的仓库用于恢复
/data/svn # svnadmin create repo-restore-incremental
首先导入第一部分数据
/data/svn # svnadmin load repo-restore-incremental <incremental_8
<<< Started new transaction, based on original revision 1
* editing path : first-svn-file ... done.
------- Committed revision 1 >>>
<<< Started new transaction, based on original revision 2
* editing path : branches ... done.
* editing path : tags ... done.
* editing path : trunk ... done.
------- Committed revision 2 >>>
<<< Started new transaction, based on original revision 3
* editing path : trunk/trunk-file ... done.
------- Committed revision 3 >>>
<<< Started new transaction, based on original revision 4
* editing path : branches/feature_script ...COPIED... done.
------- Committed revision 4 >>>
<<< Started new transaction, based on original revision 5
* editing path : branches/feature_script/feature_script.sh ... done.
------- Committed revision 5 >>>
<<< Started new transaction, based on original revision 6
* editing path : tags/release-script-1.0 ...COPIED... done.
------- Committed revision 6 >>>
<<< Started new transaction, based on original revision 7
* editing path : trunk ... done.
* editing path : trunk/feature_script.sh ...COPIED... done.
------- Committed revision 7 >>>
<<< Started new transaction, based on original revision 8
* editing path : tags/release-script-1.1 ...COPIED... done.
------- Committed revision 8 >>>
<<< Started new transaction, based on original revision 9
* editing path : trunk/feature_script.sh ... done.
------- Committed revision 9 >>>
<<< Started new transaction, based on original revision 10
* editing path : trunk/feature_script.sh ... done.
------- Committed revision 10 >>>
<<< Started new transaction, based on original revision 11
* editing path : trunk/feature_script.sh ... done.
------- Committed revision 11 >>>
<<< Started new transaction, based on original revision 12
* editing path : trunk/feature_script.sh ... done.
------- Committed revision 12 >>>
<<< Started new transaction, based on original revision 13
* editing path : tags/release-script-1.0 ... done.
------- Committed revision 13 >>>
<<< Started new transaction, based on original revision 14
* editing path : branches/feature_script/feature_script.sh ... done.
------- Committed revision 14 >>>
/data/svn #

接下来导入第2部分增量数据
/data/svn # svnadmin load repo-restore-incremental <incremental_14
<<< Started new transaction, based on original revision 9
* editing path : trunk/feature_script.sh ... done.
------- Committed revision 9 >>>
<<< Started new transaction, based on original revision 10
* editing path : trunk/feature_script.sh ... done.
------- Committed revision 10 >>>
<<< Started new transaction, based on original revision 11
* editing path : trunk/feature_script.sh ... done.
------- Committed revision 11 >>>
<<< Started new transaction, based on original revision 12
* editing path : trunk/feature_script.sh ... done.
------- Committed revision 12 >>>
<<< Started new transaction, based on original revision 13
* editing path : tags/release-script-1.0 ... done.
------- Committed revision 13 >>>
<<< Started new transaction, based on original revision 14
* editing path : branches/feature_script/feature_script.sh ... done.
------- Committed revision 14 >>>
/data/svn #

当然也可以使用-r参数指定恢复区间,可以非常灵活地进行使用。
/data/svn # cp demo-repo/conf/* repo-restore-incremental/conf/
/data/svn #
svnadmin load可以进行全量恢复和增量恢复,非常灵活。但是随着数据量的增大,恢复的时间可能会较长。另外恢复的时候还需要注意之前的配置文件也需要进行备份,不然也无法正常动作。
使用svnadmin hotcopy备份的方式,可以使用svnadmin hotcopy来进行恢复。而且在恢复的时候也无需再手动恢复设定文件,因为备份中已经包含。实际hotcopy就是由svn提供的方案1的热方式。
使用之前导出的备份数据生成一个新的仓库,步骤非常简单,怎么考出来,就怎么考回去,换一下源和目的即可。
/data/svn # svnadmin hotcopy /tmp/full_hotcopy.01 repo-restore-hotcopy
* Copied revision 0.
* Copied revision 1.
* Copied revision 2.
* Copied revision 3.
* Copied revision 4.
* Copied revision 5.
* Copied revision 6.
* Copied revision 7.
* Copied revision 8.
* Copied revision 9.
* Copied revision 10.
* Copied revision 11.
* Copied revision 12.
* Copied revision 13.
* Copied revision 14.
/data/svn #

唯一的限制是目录事前不能存在, 不然就会爆这样的错误
/data/svn # svnadmin hotcopy /tmp/full_hotcopy.01 repo-restore-hotcopy
svnadmin: E200011: '/data/svn/repo-restore-hotcopy' exists and is non-empty
/data/svn #
svnadmin hotcopy只能进行全量的备份,而不能进行增量的备份。所以恢复的时候也有同样的问题。虽然整体速度较快,但是当数据量大的时候,整体的时间花费会较多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。