版本管理之SVN实践教程:基础篇(9):备份&恢复

版权声明:本文为博主原创文章,未经博主允许欢迎转载,但请注明出处。 https://blog.csdn.net/liumiaocn/article/details/82013171

这里写图片描述

这篇文章主要介绍一下svn的常用的备份/恢复方案。

备份方案

方案1:冷备份

使用操作系统的命令cp或者tar命令进行备份。备份时如果仍有用户进行svn相关的提交或者修改操作,可能会导致备份数据的完整性出现问题,所以整体建议停止svn服务以及用户没有对svn进行操作的前提下进行备份。

限制

限制在于需要停止svn服务,以及无法进行增量备份,而且数据可能会由于不完整性会导致数据导入出现问题,所以不是推荐的方式,可以作为结合方式之一。

方案2:svnadmin dump

svnadmin提供dump子命令进行数据的备份。同时根据参数的设定可以进行全量备份和增量备份。

  • 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是推荐的备份方式,可以进行全量备份和增量备份,非常灵活。但是随着数据量的增大,保存的时间可能会较长。

方案3:svnadmin hotcopy

使用svnadmin hotcopy可以进行全量的备份,速度也比较快。新的版本现在也已经支持增量备份。增量备份的使用与dump类似,这里不再验证。

  • hotcopy子命令参数说明:
设定项 缩写 说明
–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 #

全备份:clean-logs方式

/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可以进行全量和增量的备份。虽然整体速度较快,但是当数据量大的时候,整体的时间花费会较多,而且所需的存储也会多一些。

方案4:svnsync

严格来说svnsync就不是一个备份的方式,而是像它的名字那样是用于两个库之间做同步的。所以实际的使用场景更多是HA的高可用性,svn是典型的集中式版本管理工具,一旦svn服务down掉,对开发的影响是巨大的,如果能够有接近实时的Standby-Active的双机构成,对提供稳定的服务是很有效的。在实际的使用中,与其创建一个全公司公用的不能停止的svn服务,更多的是使用不同分散的svn仓库的服务。
详细关于如何设定双机构成的svn服务,鉴于篇幅,会在其他的章节进行介绍。

限制

svnsync需要更多的资源,并且其往往会有已定的延迟,一旦出现故障可以像双机热备那样进行fail over,但是当主svn服务恢复的时候,如何进行failback也需要额外的考虑。所以往往需要结合其他几种备份机制进行管理,一般用于提供不能中断的大型的集中式的svn服务。

恢复方案

方案1:冷备份的恢复

使用操作系统的命令cp或者tar命令进行的备份。在恢复的时候直接将数据覆盖即可。就像备份时出现的问题一样:恢复时如果仍有用户进行svn相关的提交或者修改操作,也可能会导致恢复的出现问题,所以整体建议停止svn服务以及用户没有对svn进行操作的前提下进行恢复。

限制

限制在于需要停止svn服务,以及无法进行增量恢复,而且数据可能会由于不完整性会导致数据导入出现问题,所以不是推荐的方式,可以作为结合方式之一。

方案2:svnadmin load

使用svnadmin dump备份的方式,可以使用svnadmin load来进行恢复

  • load子命令的常用参数说明:
设定项 缩写 说明
–revision -r 指定版本或者版本范围(或rev1:rev2范围)
–quiet -q 安静模式:标准错误中进显示错误不输出进度信息

全备份恢复

不使用参数,使用dump生成的全量备份文件进行恢复

step1: 生成备份库

使用create生成备份库,这里为了演示,在同一个svn多仓库服务下,创建一个新的仓库用于恢复

/data/svn # svnadmin create repo-restore

step2: 使用load恢复全量数据

/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 #

step3:恢复设定文件

/data/svn # cp demo-repo/conf/* repo-restore/conf/
/data/svn #

增量备份恢复

不使用参数,使用dump生成的增量备份文件进行恢复

step1: 生成备份库

使用create生成备份库,这里为了演示,在同一个svn多仓库服务下,创建一个新的仓库用于恢复

/data/svn # svnadmin create repo-restore-incremental

step2: 使用load增量数据

首先导入第一部分数据

/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参数指定恢复区间,可以非常灵活地进行使用。

step3:恢复设定文件

/data/svn # cp demo-repo/conf/* repo-restore-incremental/conf/
/data/svn #

限制

svnadmin load可以进行全量恢复和增量恢复,非常灵活。但是随着数据量的增大,恢复的时间可能会较长。另外恢复的时候还需要注意之前的配置文件也需要进行备份,不然也无法正常动作。

方案3:svnadmin hotcopy

使用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只能进行全量的备份,而不能进行增量的备份。所以恢复的时候也有同样的问题。虽然整体速度较快,但是当数据量大的时候,整体的时间花费会较多。

猜你喜欢

转载自blog.csdn.net/liumiaocn/article/details/82013171