1、SVN备份研究1. 全量备份的实现步骤最常见和简单的备份就是直接使用拷贝命令,将版本库目录拷贝到备份目录上就可以了但是这样不是很安全的方式,因为如果在拷贝时版本库发生变化,将会造成备份的结果不够准确,失去备份的作用,为此使用提供的“svnadmin hotcopy”的命令,可以防止这种问题。例如:有如下的SVN版本库F:/SVN_ROOT/00-Organizationconfdb revprops 0 revs 0 transactions txn-protorevs hookslocks 现在将00-Organization 备份到G:SVN_FULL_BAK目录下。实现脚本全量备份,包含
2、两个文件hotcopy.bat和最终执行文件fullBackup.bat。1.1.1 hotcopy.bat脚本:echo 正在备份版本库%1%SVN_HOME%svnadmin hotcopy %1 %BACKUP_DIRECTORY%2echo 版本库%1成功备份到了%2!1.1.2 fullBackup.bat脚本:rem Subversion的安装目录set SVN_HOME=D:Program Filessvn-win32-1.6.6binrem 所有版本库的父目录set SVN_ROOT=F:SVN_ROOTrem 备份的目录set BACKUP_SVN_ROOT=G:SVN_FU
3、LL_BAK set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%date:0,10%if exist %BACKUP_DIRECTORY% goto checkBackecho 建立备份目录%BACKUP_DIRECTORY%SVN_ROOT%/fullbackup.logmkdir %BACKUP_DIRECTORY%rem 验证目录是否为版本库,如果是则取出名称备份for /r %SVN_ROOT% %I in (.) do if exist %Iconfsvnserve.conf hotcopy.bat %fI %nIgoto end:checkBackecho
4、 备份目录%BACKUP_DIRECTORY%已经存在,请清空。goto end:end注意:红色字体部分依据实际目录进行修改。1.2 测试是否成功将编写好的fullBackup.bat批处理文件放到配置库根目录下(这里是F:SVN_ROOT),测试程序能否成功执行,进入配置库根目录后双击文件fullBackup.bat,然后进入备份目录G: SVN_FULL_BAK 查看配置库根目录下的所有配置库是否都得到了备份,备份日志是否输出正确,如果这两点都通过,则说明程序没有问题了,如图:定时任务1、将文件fullBackup.bat的执行放到系统任务计划中,使得备份能够定期自动的进行。点击“开始”
5、-“控制面板”-“任务计划”-“添加计划任务”打开“任务计划向导”窗口,如图:2、点击“下一步”按钮,进入下一窗口,点击“浏览”按钮,在弹出的“选择程序以进行计划窗口”选择配置库根目录下的fullBackup.bat文件进行添加,如图:3、进入下一窗口后可以设置添加的该任务名称和任务执行的间隔时间类型,如果任务名称和程序名相同,设置每周执行一次备份的话,如图:4、点击“下一步”按钮,进入下一窗口设置任务执行的起始时间和起始日期,间隔时间类型选择不同的话,该窗口显示的内容也不同。这里设置每周五的21:00执行任务,如图:5、点击“下一步”按钮,设置任务执行时需要的用户名和密码,用户名采用默认即可
6、(默认为本机Administrator用户),密码输入本机Administrator用户的登陆密码,如图:6、点击“下一步”按钮,再在下一窗口中点击“完成”按钮,就完成了此项计划任务的添加。这样系统就可以根据设置的计划任务信息,自动地进行配置库的备份操作了。 2. 增量备份的实现步骤实现脚本增量备份,包含三个文件:dump.bat、最终执行文件svndump.bat和配置库名称配置projectlist.conf2.1.1 dump.bat脚本:ECHO OFFrem 调用格式:dump 项目库名if %1= goto no_argsset PROJECT=%1if not exist %RA
7、R_STORE%PROJECT% mkdir %RAR_STORE%PROJECT%cd %RAR_STORE%PROJECT%SET LOWER=0SET UPPER=0if not exist %Log_PATH%PROJECT% mkdir %Log_PATH%PROJECT%echo 项目库%PROJECT%开始备份 %Log_PATH%PROJECT%PROJECT%_log.txt%SVN_LOOK% youngest %SVN_REPOROOT%PROJECT% %Log_PATH%A.TMPFOR /f %D IN (%Log_PATH%A.TMP) DO set UPPER=
8、%Dif %UPPER%=0 GOTO :N_EXITif not exist %Log_PATH%PROJECT%PROJECT%_last_revision.txt GOTO :BAKUPrem 取出上次备份后的版本号,并做1处理(注意此算法未在98系统验证)FOR /f %C IN (%Log_PATH%PROJECT%PROJECT%_last_revision.txt) DO set LOWER=%Cset /A LOWER=%LOWER%+1rem 不需要备份,则跳转结束IF %LOWER% gtr %UPPER% GOTO :N_EXIT:BAKUPSET FILENAME=%P
9、ROJECT%_%LOWER%_%UPPER%ECHO 开始备份项目库:%PROJECT%,生成文件=%FILENAME%SVN_ADMIN% dump %SVN_REPOROOT%PROJECT% -r %LOWER%:head -incremental %FILENAME%.dmprem %RAR_CMD% a -df %PROJECT%_%UPPER%.rarrem 准备写备份日志信息IF %LOWER% gtr 0 GOTO :WRITENOTEECHO %PROJECT%备份时间: %date% %Log_PATH%PROJECT%PROJECT%_log.txtecho %PROJ
10、ECT%备份revision区间 从%LOWER%到%UPPER% %Log_PATH%PROJECT%PROJECT%_log.txtGOTO :COMPLETE:WRITENOTEECHO %date% %Log_PATH%PROJECT%PROJECT%_log.txtecho - 4-添加增量备份文件 %PROJECT%_%UPPER%.rar,从%LOWER%到%UPPER% %Log_PATH%PROJECT%PROJECT%_log.txt:COMPLETErem 下面一行用于拷贝备份文件到目标地址echo 将dump备份文件%FILENAME%.dmp 转移至%RAR_STOR
11、E%PROJECT% 目录下 %Log_PATH%PROJECT%PROJECT%_log.txtmove %FILENAME%.dmp %RAR_STORE%PROJECT%del %Log_PATH%A.TMPecho %UPPER% %Log_PATH%PROJECT%PROJECT%_last_revision.txt:N_EXITecho 项目库%PROJECT%处理结束! %Log_PATH%PROJECT%PROJECT%_log.txtCD. 2.1.2 svndump.bat脚本:echo offrem Subversion的安装目录及执行文件set SVN_HOME=D:P
12、rogram Filessvn-win32-1.6.6binset SVN_ADMIN=%SVN_HOME%svnadmin.exeset SVN_LOOK=%SVN_HOME%svnlook.exerem 配置库仓库根目录set SVN_REPOROOT=F:SVN_ROOTrem 压缩命令set RAR_CMD=C:Program FilesWinRARrem 增量备份文件存放路径set RAR_STORE=D:svn_increment_backuprem 日志及最后一次备份修订号存放文件目录,以下是跟增量备份脚本目录同一目录set Log_PATH=D:svn_back_scripts
13、incrementrem 读取项目库列表文件,并忽略其中;开头的行FOR /f eol=; %C IN (projectlist.conf) DO call D:svn_back_scriptsincrementdump.bat %Crem 调用格式:dump 项目库名if %1= goto no_argsset PROJECT=%1if not exist %RAR_STORE%PROJECT% mkdir %RAR_STORE%PROJECT%cd %RAR_STORE%PROJECT%SET LOWER=0SET UPPER=0if not exist %Log_PATH%PROJECT
14、% mkdir %Log_PATH%PROJECT%echo 项目库%PROJECT%开始备份 %Log_PATH%PROJECT%PROJECT%_log.txt%SVN_LOOK% youngest %SVN_REPOROOT%PROJECT% %Log_PATH%A.TMPFOR /f %D IN (%Log_PATH%A.TMP) DO set UPPER=%Dif %UPPER%=0 GOTO :N_EXITif not exist %Log_PATH%PROJECT%PROJECT%_last_revision.txt GOTO :BAKUPrem 取出上次备份后的版本号,并做1处
15、理(注意此算法未在98系统验证)FOR /f %C IN (%Log_PATH%PROJECT%PROJECT%_last_revision.txt) DO set LOWER=%Cset /A LOWER=%LOWER%+1rem 不需要备份,则跳转结束IF %LOWER% gtr %UPPER% GOTO :N_EXIT:BAKUPSET FILENAME=%PROJECT%_%LOWER%_%UPPER%注意:红色字体部分可根据实际情况进行修改。测试是否成功测试“增量备份”是否实现,进入对应的备份目录中(此处为D:SVN_INCREMENTAL_BAK)检查是否输出了备份文件以及增量备份
16、脚本目录G:svn_back_scriptsincrement下对应的备份配置库是否有日志(log.txt和last_revision.txt)。如果这两者都存在,说明备份成功了。2.2 定时任务参见本文档2.3章节3. 配置库备份的还原由于配置库的备份有“每周全量备份”和“每天增量备份”两种方式,所以备份数据的还原策略也有如下两种:1. 如果进行了“定期全量备份”后,配置库根目录下的所有配置库内容均未发生过有效修改,(也就是“增量备份”的备份目录下没有备份的数据文件),此时还原备份时间最近的全量备份的备份数据文件即可,由于我们的全量备份采用的是svnadmin hotcopy命令。那么当恢复
17、备份的时候可以直接拿来用。(使用svnadmin create创建新的版本库或登录客户端创建新的版本库,将最近的全量备份的数据文件复制到该版本库下即可)。2. 如果在进行“定期大备份”之前,配置库根目录下的某些配置库内容发生了有效修改,则先要将发生了内容修改的配置库的修改备份(小备份.dmp)合并到最近的整体备份(大备份)中,合并方法是执行如下命令:svnadmin load G:SVN_FULL_BAK2015-06-0600-Organization G:SVN_INCREMENTAL_BAK00-Organization00-Organization_49_49.dmp(注意:G:SVN_INCREMENTAL_BAK00-Organization00-Organization_49_49.dmp为配置库“每天增量备份”的所在路径,G:SVN_FULL_BAK2015-06-0600-Organization文件夹名为配置库Organization最近一次“每周全量备份”的备份库Organization所在路径恢复增量备份时按照版本从小到大的顺序)然后再按照还原策略1中的方法将备份库test进行还原。没有发生内容被有效修改的配置库,可直接按照还原策略1中的方法进行还原即可。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1