svn 备份

本文介绍Subversion (SVN) 的三种备份方式:完全备份、增量备份及同步版本库。通过详细步骤展示如何利用svnadmin工具确保版本库数据安全。

 

svn 备份

版本控制最关键的一件事是保证数据的安全性,不能因为磁盘损坏,程序故障造成版本库无可挽回的错误,为此必须制定较完备的备份策略。 
Subversion中,我们有三种备份方式:完全备份,增量备份和同步版本库。 

1.
完全备份: 
最常见和简单的备份就是直接使用拷贝命令,将版本库目录拷贝到备份目录上,就可以了。但是这样不是很安全的方式,因为如果在拷贝时版本库发生变化,将会造成备份的结果不够准确,失去备份的作用,为此Subversion提供了“svnadmin hotcopy”命令,可以防止这种问题。 
比如有如下版本库: 
D:/svnroot 
├─project1 
│     ├─conf 
│     ├─dav 
│     ├─db 
│     │     ├─revprops 
│     │     ├─revs 
│     │     └─transactions 
│     ├─hooks 
│     └─locks 
└─project2 
       ├─conf 
       ├─dav 
       ├─db 
       │     ├─revprops 
       │     ├─revs 
       │     └─transactions 
       ├─hooks 
└─locks 
如果要把project1备份到D:/svnrootbackup目录下,只需要运行:

svnadmin hotcopy d:/svnroot/project1 d:/ svnrootbackup /project1 

PS:
如果我们目录下有很多版本库,需要为每个版本库写这样一条语句备份,必须想办法优化这个过程。为此,建立以下的2bat文件,
simplebackup.bat
 
@echo
正在备份版本库%1...... 
@%SVN_HOME%/bin/svnadmin hotcopy %1 %BACKUP_DIRECTORY%/%2 
@echo
版本库%1成功备份到了%2 

backup.bat
 
echo off 
rem Subversion
的安装目录 
set SVN_HOME="D:/Subversion" 
rem
所有版本库的父目录 
set SVN_ROOT=D:/svnroot 
rem
备份的目录 
set BACKUP_SVN_ROOT=D:/svnrootbak 
set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%/%date:~0,10% 
if exist %BACKUP_DIRECTORY% goto checkBack 
echo
建立备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/backup.log 
mkdir %BACKUP_DIRECTORY% 
rem
验证目录是否为版本库,如果是则取出名称备份 
for /r %SVN_ROOT% %%I in (.) do @if exist "%%I/conf/svnserve.conf" %SVN_ROOT%/simplebackup.bat "%%~fI" %%~nI 
goto end 
:checkBack 
echo
备份目录%BACKUP_DIRECTORY%已经存在,请清空。 
goto end 
:end 

使用的时候,只需要修改backup.bat开头的三个路径,将两个脚本拷贝到"SVN_ROOT"下就可以了。根据以上的配置,你只需要运行backup.bat,就可以把"SVN_ROOT"下的版本库都备份到"BACKUP_SVN_ROOT"里,并且存放在备份所在的目录里。 

2.
增量备份: 
尽管完全备份非常简单,但是也是有代价的,当版本库非常巨大时,经常进行完全备份是不现实的,也并不必要,但是一旦版本库在备份之间发生问题,该如何呢,这里我们就用到了增量备份。 
增量备份通常要与完全备份结合使用,记录着每次Subversion提交的变化,然后在需要恢复时能够回到最新的可用状态。 
我们使用的是,svnadmin dump命令进行增量的备份,使用方法是: 
svnadmin dump d:/sourcecode/project1 --revision 15 --incremental > d:/sourcecode/dumpfile 

上面的命令实现了对修订版本15进行增量的备份,其中的输出文件dumpfile只保存了修订版本15更改的内容 

恢复增量备份时,使用方法是: 
svnadmin load d:/sourcecode/project1 < d:/sourcecode/dumpfile 
上面的命令实现了对增量备份文件恢复到版本库project1 

使用钩子脚本Hooks实现自动增量备份: 
1)
建立deltabackup.bat文件,内容为: 
@echo
正在备份版本库%2...... 
%SVN_HOME%/bin/svnadmin dump %SVN_ROOT%/%1 --incremental --revision %2 >> %DELTA_BACKUP_SVN_ROOT%/%1.dump 
@echo
版本库%2成功备份到了%3 
2)
建立post-commit.bat文件,内容为: 
echo off 
set SVN_HOME="C:/Program Files/Subversion" 
set SVN_ROOT=D:/svnroot 
set UNIX_SVN_ROOT=D:/svnroot 
set DELTA_BACKUP_SVN_ROOT=D:/svnrootbak/delta 
set LOG_FILE=%1/backup.log 
echo backup revision %2 >> %LOG_FILE% 
for /r %SVN_ROOT% %%I in (.) do if D:/svnroot/%%~nI == %1 %SVN_ROOT%/%%~nI/hooks/deltaBackup.bat %%~nI %2 
goto end 
:end 
3)
把以上两个脚本可以直接拷贝到版本库的hooks目录下,就可以实现版本库的自动备份。 

3.
同步版本库: 
同步机制,可以实现一个版本库同另一个版本库的同步(但好像只是单向的),我们可以用来实现版本库的备份或镜像。 
例如:同步版本库d:/sourcecode/project1 
1)
新建一个空的版本库project2 
运行命令: 
svnadmin create d:/sourcecode/project2 

2)
为新的版本库创建pre-revprop-change钩子脚本(hook script) 
d:/sourcecode/project2/hooks目录下新建一个空的pre-revprop-change.bat文件 

3)
初始化版本库 
运行命令: 
svnsync init file:///d:/sourcecode/project2 file:///d:/sourcecode/project1 

4)
同步版本库 
运行命令: 
svnsync sync file:///d:/sourcecode/project2 
  
5)
至此,版本库同步已经完成。 
在使用新的版本库之前,还需要根据需要对版本库的访问权限等进行配置。 

使用钩子脚本Hooks实现自动同步: 
1)
建立post-commit.bat文件,内容为: 
echo off 
set SVN_HOME="D:/Subversion" 
%SVN_HOME%/bin/svnsync sync     --non-interactive svn://localhost/project2 
2)
post-commit.bat文件放到版本库project1下的hooks目录下,这样project1每次提交,都会引起project2的同步 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值