SVN备份研究.docx
《SVN备份研究.docx》由会员分享,可在线阅读,更多相关《SVN备份研究.docx(10页珍藏版)》请在冰点文库上搜索。
SVN备份研究
1.全量备份的实现步骤
最常见和简单的备份就是直接使用拷贝命令,将版本库目录拷贝到备份目录上就可以了.但是这样不是很安全的方式,因为如果在拷贝时版本库发生变化,将会造成备份的结果不够准确,失去备份的作用,为此使用提供的“svnadminhotcopy”的命令,可以防止这种问题。
例如:
有如下的SVN版本库
F:
/SVN_ROOT/00-Organization
├─conf
├─db
│├─revprops
││└─0
│├─revs
││└─0
│├─transactions
│└─txn-protorevs
├─hooks
└─locks
现在将00-Organization备份到G:
\SVN_FULL_BAK目录下。
实现脚本
全量备份,包含两个文件hotcopy.bat和最终执行文件fullBackup.bat。
1.1.1hotcopy.bat脚本:
@echo正在备份版本库%1……
@%SVN_HOME%\svnadminhotcopy%1%BACKUP_DIRECTORY%\%2
@echo版本库%1成功备份到了%2!
1.1.2fullBackup.bat脚本:
remSubversion的安装目录
setSVN_HOME="D:
\ProgramFiles\svn-win32-1.6.6\bin"
rem所有版本库的父目录
setSVN_ROOT=F:
\SVN_ROOT
rem备份的目录
setBACKUP_SVN_ROOT=G:
\SVN_FULL_BAK
setBACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:
~0,10%
ifexist%BACKUP_DIRECTORY%gotocheckBack
echo建立备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/fullbackup.log
mkdir%BACKUP_DIRECTORY%
rem验证目录是否为版本库,如果是则取出名称备份
for/r%SVN_ROOT%%%Iin(.)do@ifexist"%%I\conf\svnserve.conf"hotcopy.bat"%%~fI"%%~nI
gotoend
:
checkBack
echo备份目录%BACKUP_DIRECTORY%已经存在,请清空。
gotoend
:
end
注意:
红色字体部分依据实际目录进行修改。
1.2测试是否成功
将编写好的fullBackup.bat批处理文件放到配置库根目录下(这里是F:
\SVN_ROOT),测试程序能否成功执行,进入配置库根目录后双击文件fullBackup.bat,然后进入备份目录G:
\SVN_FULL_BAK查看配置库根目录下的所有配置库是否都得到了备份,备份日志是否输出正确,如果这两点都通过,则说明程序没有问题了,如图:
定时任务
1、将文件fullBackup.bat的执行放到系统任务计划中,使得备份能够定期自动的进行。
点击“开始”->“控制面板”->“任务计划”->“添加计划任务”打开“任务计划向导”窗口,如图:
2、点击“下一步”按钮,进入下一窗口,点击“浏览”按钮,在弹出的“选择程序以进行计划窗口”选择配置库根目录下的fullBackup.bat文件进行添加,如图:
3、进入下一窗口后可以设置添加的该任务名称和任务执行的间隔时间类型,如果任务名称和程序名相同,设置每周执行一次备份的话,如图:
4、点击“下一步”按钮,进入下一窗口设置任务执行的起始时间和起始日期,间隔时间类型选择不同的话,该窗口显示的内容也不同。
这里设置每周五的21:
00执行任务,如图:
5、点击“下一步”按钮,设置任务执行时需要的用户名和密码,用户名采用默认即可(默认为本机Administrator用户),密码输入本机Administrator用户的登陆密码,如图:
6、点击“下一步”按钮,再在下一窗口中点击“完成”按钮,就完成了此项计划任务的添加。
这样系统就可以根据设置的计划任务信息,自动地进行配置库的备份操作了。
2.增量备份的实现步骤
实现脚本
增量备份,包含三个文件:
dump.bat、最终执行文件svndump.bat和配置库名称配置projectlist.conf
2.1.1dump.bat脚本:
@ECHOOFF
rem调用格式:
dump项目库名
if"%1"==""gotono_args
setPROJECT=%1
ifnotexist%RAR_STORE%\%PROJECT%mkdir%RAR_STORE%\%PROJECT%
cd%RAR_STORE%\%PROJECT%
SETLOWER=0
SETUPPER=0
ifnotexist%Log_PATH%\%PROJECT%mkdir%Log_PATH%\%PROJECT%
@echo项目库%PROJECT%开始备份>>%Log_PATH%\%PROJECT%\%PROJECT%_log.txt
%SVN_LOOK%youngest%SVN_REPOROOT%\%PROJECT%>%Log_PATH%\A.TMP
@FOR/f%%DIN(%Log_PATH%\A.TMP)DOsetUPPER=%%D
if%UPPER%==0GOTO:
N_EXIT
ifnotexist%Log_PATH%\%PROJECT%\%PROJECT%_last_revision.txtGOTO:
BAKUP
rem取出上次备份后的版本号,并做+1处理(注意此算法未在98系统验证)
@FOR/f%%CIN(%Log_PATH%\%PROJECT%\%PROJECT%_last_revision.txt)DO@setLOWER=%%C
@set/ALOWER=%LOWER%+1
rem不需要备份,则跳转结束
IF%LOWER%gtr%UPPER%GOTO:
N_EXIT
:
BAKUP
SETFILENAME=%PROJECT%_%LOWER%_%UPPER%
@ECHO开始备份项目库:
%PROJECT%,生成文件=%FILENAME%
%SVN_ADMIN%dump%SVN_REPOROOT%\%PROJECT%-r%LOWER%:
head--incremental>%FILENAME%.dmp
rem%RAR_CMD%a-df%PROJECT%_%UPPER%.rar
rem准备写备份日志信息
IF%LOWER%gtr0GOTO:
WRITENOTE
@ECHO%PROJECT%备份时间:
%date%>>%Log_PATH%\%PROJECT%\%PROJECT%_log.txt
@echo%PROJECT%备份revision区间从[%LOWER%]到[%UPPER%]>>%Log_PATH%\%PROJECT%\%PROJECT%_log.txt
GOTO:
COMPLETE
:
WRITENOTE
@ECHO%date%>>%Log_PATH%\%PROJECT%\%PROJECT%_log.txt
@echo--4------添加增量备份文件%PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%]>>%Log_PATH%\%PROJECT%\%PROJECT%_log.txt
:
COMPLETE
rem下面一行用于拷贝备份文件到目标地址
@echo将dump备份文件%FILENAME%.dmp转移至%RAR_STORE%\%PROJECT%目录下>>%Log_PATH%\%PROJECT%\%PROJECT%_log.txt
move%FILENAME%.dmp%RAR_STORE%\%PROJECT%\
del%Log_PATH%\A.TMP
@echo%UPPER%>%Log_PATH%\%PROJECT%\%PROJECT%_last_revision.txt
:
N_EXIT
@echo项目库%PROJECT%处理结束!
>>%Log_PATH%\%PROJECT%\%PROJECT%_log.txt
@CD..
2.1.2svndump.bat脚本:
echooff
remSubversion的安装目录及执行文件
setSVN_HOME="D:
\ProgramFiles\svn-win32-1.6.6\bin"
setSVN_ADMIN=%SVN_HOME%\svnadmin.exe
setSVN_LOOK=%SVN_HOME%\svnlook.exe
rem配置库仓库根目录
setSVN_REPOROOT=F:
\SVN_ROOT
rem压缩命令
setRAR_CMD="C:
\ProgramFiles\WinRAR"
rem增量备份文件存放路径
setRAR_STORE="D:
\svn_increment_backup"
rem日志及最后一次备份修订号存放文件目录,以下是跟增量备份脚本目录同一目录
setLog_PATH=D:
\svn_back_scripts\increment
rem读取项目库列表文件,并忽略其中;开头的行
FOR/f"eol=;"%%CIN(projectlist.conf)DOcallD:
\svn_back_scripts\increment\dump.bat%%C
rem调用格式:
dump项目库名
if"%1"==""gotono_args
setPROJECT=%1
ifnotexist%RAR_STORE%\%PROJECT%mkdir%RAR_STORE%\%PROJECT%
cd%RAR_STORE%\%PROJECT%
SETLOWER=0
SETUPPER=0
ifnotexist%Log_PATH%\%PROJECT%mkdir%Log_PATH%\%PROJECT%
@echo项目库%PROJECT%开始备份>>%Log_PATH%\%PROJECT%\%PROJECT%_log.txt
%SVN_LOOK%youngest%SVN_REPOROOT%\%PROJECT%>%Log_PATH%\A.TMP
@FOR/f%%DIN(%Log_PATH%\A.TMP)DOsetUPPER=%%D
if%UPPER%==0GOTO:
N_EXIT
ifnotexist%Log_PATH%\%PROJECT%\%PROJECT%_last_revision.txtGOTO:
BAKUP
rem取出上次备份后的版本号,并做+1处理(注意此算法未在98系统验证)
@FOR/f%%CIN(%Log_PATH%\%PROJECT%\%PROJECT%_last_revision.txt)DO@setLOWER=%%C
@set/ALOWER=%LOWER%+1
rem不需要备份,则跳转结束
IF%LOWER%gtr%UPPER%GOTO:
N_EXIT
:
BAKUP
SETFILENAME=%PROJECT%_%LOWER%_%UPPER%
注意:
红色字体部分可根据实际情况进行修改。
测试是否成功
测试“增量备份”是否实现,进入对应的备份目录中(此处为D:
\SVN_INCREMENTAL_BAK)检查是否输出了备份文件以及增量备份脚本目录G:
\svn_back_scripts\increment下对应的备份配置库是否有日志(log.txt和last_revision.txt)。
如果这两者都存在,说明备份成功了。
2.2定时任务
参见本文档2.3章节
3.配置库备份的还原
由于配置库的备份有“每周全量备份”和“每天增量备份”两种方式,所以备份数据的还原策略也有如下两种:
1.如果进行了“定期全量备份”后,配置库根目录下的所有配置库内容均未发生过有效修改,(也就是“增量备份”的备份目录下没有备份的数据文件),此时还原备份时间最近的全量备份的备份数据文件即可,由于我们的全量备份采用的是svnadminhotcopy命令。
那么当恢复备份的时候可以直接拿来用。
(使用svnadmincreate创建新的版本库或登录客户端创建新的版本库,将最近的全量备份的数据文件复制到该版本库下即可)。
2.如果在进行“定期大备份”之前,配置库根目录下的某些配置库内容发生了有效修改,则先要将发生了内容修改的配置库的修改备份(小备份.dmp)合并到最近的整体备份(大备份)中,合并方法是执行如下命令:
svnadminloadG:
\SVN_FULL_BAK\2015-06-06\00-Organization\SVN_INCREMENTAL_BAK\00-Organization\00-Organization_49_49.dmp
(注意:
G:
\SVN_INCREMENTAL_BAK\00-Organization\00-Organization_49_49.dmp为配置库“每天增量备份”的所在路径,
G:
\SVN_FULL_BAK\2015-06-06\00-Organization文件夹名为配置库Organization最近一次“每周全量备份”的备份库Organization所在路径
恢复增量备份时按照版本从小到大的顺序)
然后再按照还原策略1中的方法将备份库test进行还原。
没有发生内容被有效修改的配置库,可直接按照还原策略1中的方法进行还原即可。