Windows下SVN的备份方案

luyibo 2011-07-15

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

1,完全备份:

最常见和简单的备份就是直接使用拷贝命令,将版本库目录拷贝到备份目录上,就可以了.但是这样不是很安全的方式,因为如果在拷贝时版本库发生变化,将会造马备份的结果不够准确,失去备份的作用,为此xubversion提供了"svnadminhotcopy"的命令,可以防止这种问题.

比如有如下的版本库:

D:/svnroot

├─project1

│├─conf

│├─dav

│├─db

││├─revprops

││├─revs

││└─transactions

│├─hooks

│└─locks

└─project2

├─conf

├─dav

├─db

│├─revprops

│├─revs

│└─transactions

├─hooks

└─locks

如果要把project1备份到D:/svnrootbackup目录下,只需要运行:svnadminhotcopyd:/svnroot/project1d:/svnrootbackup/project1

ps:如果我们目录下有很多版本库,需要为每个版本库写这样一条语句备份,必需想办法优化这个过程.为此,建立以下的2个bat文件.

simplebackup.bat:

@echo正在备份版本库%1......

@%SVN_HOME%/bin/svnadminhotcopy%1%BACKUP_DIRECTORY%/%2

@echo版本库%1成功备份到了%2!

backup.bat:

echooff

remSubversion的安装目录

setSVN_HOME="D:/Subversion"

rem所有版本库的父目录

setSVN_ROOT=D:/svnroot

rem备份的目录

setBACKUP_SVN_ROOT=D:/svnrootbak

setBACKUP_DIRECTORY=%BACKUP_SVN_ROOT%/%date:~0,10%

ifexist%BACKUP_DIRECTORY%gotocheckBack

echo建立备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/backup.log

mkdir%BACKUP_DIRECTORY%

rem验证目录是否为版本库,如果是则取出名称备份

for/r%SVN_ROOT%%%Iin(.)do@ifexist"%%I/conf/svnserve.conf"%SVN_ROOT%/simplebackup.bat"%%~fI"%%~nI

gotoend

:checkBack

echo备份目录%BACKUP_DIRECTORY%已经存在,请清空。

gotoend

:end

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

2,增量备份.

尽管完全备份非常简单,但是也是有代价的,当版本库非常巨大的时候,经常进行完全备份是不现实的,也并不必要,但是一量版本库在备份之间发生问题该如何呢,我们就用到了增量备份.

增量备份通常要与完全备份结合使用,记录着每次subversion提交的变化,然后在需要恢复时能够回到最新的可用状态.

我拉使用的是,svnadmindump命令进行增量的备份,使用方法是:

svnadmindumpd:/sourcecode/project1--revision15--incremental>d:/sourcecode/dumpfile

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

恢复增量备份时,使用方法是:

svnadminloadd:/sourcecode/project1<d:/sourcecode/dumpfile

上面的命令实现了对增量备份文件恢复到版本库project1中

使用钩子脚本Hooks实现自动增量备份:

1)建立deltabackup.bat文件,内容为:

@echo正在备份版本库%2......

%SVN_HOME%/bin/svnadmindump%SVN_ROOT%/%1--incremental--revision%2>>%DELTA_BACKUP_SVN_ROOT%/%1.dump

@echo版本库%2成功备份到了%3!

2)建立post-commit.bat文件,内容为:

echooff

setSVN_HOME="C:/ProgramFiles/Subversion"

setSVN_ROOT=D:/svnroot

setUNIX_SVN_ROOT=D:/svnroot

setDELTA_BACKUP_SVN_ROOT=D:/svnrootbak/delta

setLOG_FILE=%1/backup.log

echobackuprevision%2>>%LOG_FILE%

for/r%SVN_ROOT%%%Iin(.)doifD:/svnroot/%%~nI==%1%SVN_ROOT%/%%~nI/hooks/deltaBackup.bat%%~nI%2

gotoend

:end

3)把以上两个脚本可以直接拷贝到版本库的hooks目录下,就可以实现版本库的自动备份。

3.同步版本库:

同步机制,可以实现一个版本库同另一个版本库的同步(但好像只是单向的),我们可以用来实现版本库的备份或镜像。

例如:同步版本库d:/sourcecode/project1

1)新建一个空的版本库project2

运行命令:

svnadmincreated:/sourcecode/project2

2)为新的版本库创建pre-revprop-change钩子脚本(hookscrīpt)

在d:/sourcecode/project2/hooks目录下新建一个空的pre-revprop-change.bat文件

3)初始化版本库

运行命令:

svnsyncinitfile:///d:/sourcecode/project2file:///d:/sourcecode/project1

4)同步版本库

运行命令:

svnsyncsyncfile:///d:/sourcecode/project2

5)至此,版本库同步已经完成。

在使用新的版本库之前,还需要根据需要对版本库的访问权限等进行配置。

使用钩子脚本Hooks实现自动同步:

1)建立post-commit.bat文件,内容为:

echooff

setSVN_HOME="D:/Subversion"

%SVN_HOME%/bin/svnsyncsync--non-interactivesvn://localhost/project2

2)把post-commit.bat文件放到版本库project1下的hooks目录下,这样project1每次提交,都会引起project2的同步

相关推荐

飞到大连 / 0评论 2011-04-11