Svn在Windows下实现自动全量增量备份和异地备份(共13页).docx
精选优质文档-倾情为你奉上SVN在Windows下实现自动全量增量备份和异地备份1 SVN备份介绍1.1 SVN备份内容SVN在Windows下的自动备份实现,包括:1) SVN目录的全备份(1周或1个月备份1次,由windows计划来调度执行);2) SVN增量备份(每日备份1次,由windows计划来调度执行);1.2 SVN备份流程上述2类备份分别进行的流程如下:1) 通过windows定时任务功能,调度进行备份、压缩、FTP上传功能的bat文件;2) 将自动备份成按每日日期.dmp备份到SVN本机的其他磁盘空间中,分全备份和增量备份;3) 启动ftp上传命令,将备份的rar包立即上传在异地服务器上。异地服务器需提前架好ftp服务器并建立好相关上传目录,建议使用用FileZilla_Server、serverU或者简单ftp软件进行搭建。4) 整个上传过程,详细记录备份、压缩、FTP上传各步骤详细日志,随时可以查阅每次备份记录的详细情况。1.3 SVN还原功能可以进行还原所有版本库2 SVN备份BAT设计1.1 全备份BAT1)SVN的全备份,AllBackUp.bat:Beginecho offsetlocal enabledelayedexpansionecho 正在准备备份所有版本库echo.:设置SVN命令目录set SVN_CMD="E:VisualSVN Serverbin":设置所有版本库根目录set REPOS_ROOT=D:Repositories:设置所有版本库备份根目录set REPOS_BACKUP_ROOT=F:SvnBackup全备份if not exist %REPOS_BACKUP_ROOT% mkdir %REPOS_BACKUP_ROOT%:设置所有版本库备份目录set BACKUP_DIRECTORY=%REPOS_BACKUP_ROOT%date:0,10%.dmpset BACKUP_DIRECTORY=%BACKUP_DIRECTORY:/=-%rem if exist %BACKUP_DIRECTORY% goto Error2rem mkdir %BACKUP_DIRECTORY%if not exist %BACKUP_DIRECTORY% mkdir %BACKUP_DIRECTORY%:设置用户权限信息备份目录set REPOS_USER_INFO_DIRECTORY=%BACKUP_DIRECTORY%UserInfoif not exist %REPOS_USER_INFO_DIRECTORY% mkdir %REPOS_USER_INFO_DIRECTORY%:备份所有版本库:i->版本库、j->版本库最新版本号、k->上次完全备份时版本库的版本号echo =%date% %time:0,8%:执行全部全量备份版本库.= >> %REPOS_BACKUP_ROOT%BackUp.logecho 备份的版本库版本信息如下: >> %REPOS_BACKUP_ROOT%BackUp.log:读取版本库根目录下每个文件夹,并判断其是否是一个版本库for /r %REPOS_ROOT% %i in (.) do if exist %iconfsvnserve.conf (:将当前版本库的最新版本信息写入tmp文件%SVN_CMD%svnlook youngest %fi > %ni_last_revision.tmp:取出当前版本库的最新版本信息,判断其是否大于0,是则进行处理for /f %j in (%ni_last_revision.tmp) do if %j gtr 0 (echo.echo 开始备份版本库%ni:全量备份版本库%SVN_CMD%svnadmin dump -deltas %fi > %BACKUP_DIRECTORY%ni-0-%j.dmpecho %time:0,8% %ni: 0-%j >> %REPOS_BACKUP_ROOT%BackUp.logecho 版本库%ni已经成功备份到%BACKUP_DIRECTORY%ni-0-%j.dmp!):删除临时文件del %ni_last_revision.tmp)echo.echo 开始备份用户权限信息xcopy /y %REPOS_ROOT%authz %REPOS_USER_INFO_DIRECTORY%xcopy /y %REPOS_ROOT%authz-windows %REPOS_USER_INFO_DIRECTORY%xcopy /y %REPOS_ROOT%htpasswd %REPOS_USER_INFO_DIRECTORY%echo ->> %REPOS_BACKUP_ROOT%BackUp.logecho.echo 用户权限信息备份成功!echo %time:0,8% 用户权限信息备份成功! >> %REPOS_BACKUP_ROOT%BackUp.logecho.echo 全部版本库备份成功!echo %time:0,8% 全部版本库备份成功! >> %REPOS_BACKUP_ROOT%BackUp.logAllBackupByFtpgoto end:Error2echo.echo 备份目录已经存在,请确认后删除该目录,重新运行程序!goto End:Endecho.echo 程序执行结束!2)SVN的全备份进行FTP上传,AllBackupByFtp.batecho offREM =设置区Start=set ftpUser=svnset ftpPass=svnbackupset ftpIP=192.168.1.22set ftpPort=2016REM 指定从FTP下载下来的文件存放到本机哪个目录set ftpFolder=/全备份REM 本地需要备份的根目录set SvnBackupRoot=F:SvnBackup全备份REM 本地需要打压缩包的备份目录(今天备份文件夹2016-01-01.dmp)set SvnBackupFolder=%SvnBackupRoot%date:0,10%.dmpREM 需要压缩成的文件路径及文件名(今天备份上传文件2016-01-01.dmp.rar)set rarToFilePath=%SvnBackupFolder%.rarREM RAR执行文件的路径set rarExePath="C:Program FilesWinRAR"REM RAR执行文件的路径set bakupLogFilePath=%SvnBackupRoot%BackUp.logREM FTP命令执行文件缓存set ftpFile=%cd%TempFTP.txt>"%ftpFile%" ( echo,open %ftpIP% %ftpPort% echo,%ftpUser% echo,%ftpPass% echo cd "%ftpFolder%" echo prompt off echo bin echo put %rarToFilePath% echo put %bakupLogFilePath% echo bye)set Path=%Path%;%rarExePath%set logFilePath=%SvnBackupRoot%ftpUp.logREM =设置区End =echo =%date% 执行异地版本库全量备份开始= >> %logFilePath%if not exist %SvnBackupFolder% goto Error1echo %time:0,8% 备份压缩开始. >> %logFilePath%WinRAR.exe a -ep1 -k -r -s -ibck %rarToFilePath% %SvnBackupFolder%echo %time:0,8% 备份压缩成功,压缩的文件路径为:%rarToFilePath% >> %logFilePath%echo %time:0,8% 备份压缩继续上传FTP开始. >> %logFilePath%ftp -v -i -s:"%ftpFile%"echo %time:0,8% 上传FTP成功,上传FTP目录为:%ftpFolder% >> %logFilePath%del /q /s /f %rarToFilePath%echo. >> %logFilePath%goto end:Error1echo.echo %time:0,8% 提示: 需要进行压缩打包的备份文件夹%SvnBackupFolder%不存在,请确认SVN是否本地备份完成! >> %logFilePath%echo %time:0,8% 备份失败! >> %logFilePath%echo. >> %logFilePath%echo 提示:echo 需要进行压缩打包的备份文件夹%SvnBackupFolder%不存在,请确认SVN是否本地备份完成!:Endecho.echo 程序执行结束!1.2 增量备份BAT1)SVN数据库的增量备份,IncreBackUp.bat:Beginecho offsetlocal enabledelayedexpansionecho 正在准备备份所有版本库echo.:设置SVN命令目录set SVN_CMD="E:VisualSVN Serverbin":设置所有版本库根目录set REPOS_ROOT=D:Repositories:设置所有版本库备份根目录set REPOS_BACKUP_ROOT=F:SvnBackup增量备份if not exist %REPOS_BACKUP_ROOT% mkdir %REPOS_BACKUP_ROOT%:获取LastRevisions目录set REPOS_LAST_REVERSION_DIRECTORY=%REPOS_BACKUP_ROOT%LastRevisionsrem if not exist %REPOS_LAST_REVERSION_DIRECTORY% goto Error1 if not exist %REPOS_LAST_REVERSION_DIRECTORY% mkdir %REPOS_LAST_REVERSION_DIRECTORY%:设置所有版本库备份目录set BACKUP_DIRECTORY=%REPOS_BACKUP_ROOT%date:0,10%.dmpset BACKUP_DIRECTORY=%BACKUP_DIRECTORY:/=-%rem if exist %BACKUP_DIRECTORY% goto Error2rem mkdir %BACKUP_DIRECTORY%if not exist %BACKUP_DIRECTORY% mkdir %BACKUP_DIRECTORY%:设置用户权限信息备份目录set REPOS_USER_INFO_DIRECTORY=%BACKUP_DIRECTORY%UserInfoif not exist %REPOS_USER_INFO_DIRECTORY% mkdir %REPOS_USER_INFO_DIRECTORY%:设置LastRevisions备份目录set REPOS_LAST_REVERSION_BACKUP_DIRECTORY=%BACKUP_DIRECTORY%LastRevisionsif not exist %REPOS_LAST_REVERSION_BACKUP_DIRECTORY% mkdir %REPOS_LAST_REVERSION_BACKUP_DIRECTORY%:备份所有版本库:i->版本库、j->版本库最新版本号、k->上次完全备份时版本库的版本号echo =%date% %time:0,8%:执行全部版本库备份.= >> %REPOS_BACKUP_ROOT%BackUp.logecho 备份的版本库版本信息如下: >> %REPOS_BACKUP_ROOT%BackUp.log:读取版本库根目录下每个文件夹,并判断其是否是一个版本库for /r %REPOS_ROOT% %i in (.) do if exist %iconfsvnserve.conf (:将当前版本库的最新版本信息写入tmp文件%SVN_CMD%svnlook youngest %fi > %ni_last_revision.tmp:取出当前版本库的最新版本信息,判断其是否大于0,是则进行处理for /f %j in (%ni_last_revision.tmp) do if %j gtr 0 (:判断以前是否存在该版本库的版本信息,存在说明以前备份过,需要基于其进行备份;否则对该版本库进行全新备份if exist %REPOS_LAST_REVERSION_DIRECTORY%ni_last_revision.txt (:读取该版本库上次备份时保存的版本信息,如果小于当前版本信息则进行处理for /f %k in (%REPOS_LAST_REVERSION_DIRECTORY%ni_last_revision.txt) do if %k lss %j (echo.echo 开始备份版本库%ni:取得该版本库本次备份的起始版本号set version=%kset /a version=!version!+1:增量备份版本库%SVN_CMD%svnadmin dump -deltas %fi -revision !version!:head -incremental > %BACKUP_DIRECTORY%ni-!version!-%j.dmpecho %ni: !version!-%j >> %REPOS_BACKUP_ROOT%BackUp.logecho 版本库%ni已经成功备份到%BACKUP_DIRECTORY%ni-!version!-%j.dmp!) else (echo.echo 开始备份版本库%ni:全量备份版本库%SVN_CMD%svnadmin dump -deltas %fi > %BACKUP_DIRECTORY%ni-0-%j.dmpecho %ni: 0-%j >> %REPOS_BACKUP_ROOT%BackUp.logecho 版本库%ni已经成功备份到%BACKUP_DIRECTORY%ni-0-%j.dmp!):将本次版本库备份时的最新版本信息写入文件保存echo %j> %REPOS_LAST_REVERSION_DIRECTORY%ni_last_revision.txtecho %j> %REPOS_LAST_REVERSION_BACKUP_DIRECTORY%ni_last_revision.txt):删除临时文件del %ni_last_revision.tmp)echo.echo 开始备份用户权限信息xcopy /y %REPOS_ROOT%authz %REPOS_USER_INFO_DIRECTORY%xcopy /y %REPOS_ROOT%authz-windows %REPOS_USER_INFO_DIRECTORY%xcopy /y %REPOS_ROOT%htpasswd %REPOS_USER_INFO_DIRECTORY%echo.echo 用户权限信息备份成功!echo.echo 全部版本库备份成功!IncreBackupByFtpgoto end:Error1echo.echo 提示:echo 上次备份保存的%REPOS_LAST_REVERSION_DIRECTORY%文件夹不存在,请确认后从上次备份中拷贝LastReversions到%REPOS_BACKUP_ROOT%目录,重新运行程序;echo 或者,不基于上次备份重新执行备份!echo 重新备份?(Y/N)set /p input=if %input%=Y (mkdir %REPOS_LAST_REVERSION_DIRECTORY%goto Begin) else (goto End):Error2echo.echo 备份目录已经存在,请确认后删除该目录,重新运行程序!goto End:Endecho.echo 程序执行结束!2)SVN数据的增量备份的FTP上传,IncreBackupByFtp.batecho offREM =设置区Start=set ftpUser=svnset ftpPass=svnbackupset ftpIP=192.168.1.22set ftpPort=2016REM 指定从FTP下载下来的文件存放到本机哪个目录set ftpFolder=/增量备份REM 本地需要备份的根目录set SvnBackupRoot=F:SvnBackup增量备份REM 本地需要打压缩包的备份目录(今天备份文件夹2016-01-01.dmp)set SvnBackupFolder=%SvnBackupRoot%date:0,10%.dmpREM 需要压缩成的文件路径及文件名(今天备份上传文件2016-01-01.dmp.rar)set rarToFilePath=%SvnBackupFolder%.rarREM RAR执行文件的路径set rarExePath="C:Program FilesWinRAR"REM RAR执行文件的路径set bakupLogFilePath=%SvnBackupRoot%BackUp.logREM FTP命令执行文件缓存set ftpFile=%cd%TempFTP.txt>"%ftpFile%" ( echo,open %ftpIP% %ftpPort% echo,%ftpUser% echo,%ftpPass% echo cd "%ftpFolder%" echo prompt off echo bin echo put %rarToFilePath% echo put %bakupLogFilePath% echo bye)set Path=%Path%;%rarExePath%set logFilePath=%SvnBackupRoot%ftpUp.logREM =设置区End =echo =%date% 执行异地版本库增量备份开始.= >> %logFilePath%if not exist %SvnBackupFolder% goto Error1echo %time:0,8% 备份压缩开始. >> %logFilePath%WinRAR.exe a -ep1 -k -r -s -ibck %rarToFilePath% %SvnBackupFolder%echo %time:0,8% 备份压缩成功,压缩的文件路径为:%rarToFilePath% >> %logFilePath%echo %time:0,8% 备份压缩继续上传FTP开始. >> %logFilePath%ftp -v -i -s:"%ftpFile%"echo %time:0,8% 上传FTP成功,上传FTP目录为:%ftpFolder% >> %logFilePath%del /q /s /f %rarToFilePath%echo. >> %logFilePath%goto end:Error1echo.echo %time:0,8% 提示: 需要进行压缩打包的备份文件夹%SvnBackupFolder%不存在,请确认SVN是否本地备份完成! >> %logFilePath%echo %time:0,8% 备份失败! >> %logFilePath%echo. >> %logFilePath%echo 提示:echo 需要进行压缩打包的备份文件夹%SvnBackupFolder%不存在,请确认SVN是否本地备份完成!:Endecho.echo 程序执行结束!3 SVN还原BAT设计SVN的还原LoadBackUp.batecho offecho 正在准备还原所有版本库echo.:设置SVN命令目录set SVN_CMD="E:VisualSVN Serverbin":设置所有版本库根目录set REPOS_ROOT=D:Repositories:设置所有版本库备份根目录set REPOS_BACKUP_ROOT=F:SvnBackup增量备份if not exist %REPOS_BACKUP_ROOT% goto Error:还原所有版本库echo =%date% %time:0,8%:执行版本库执行还原操作 = >> %REPOS_BACKUP_ROOT%SvnLoad.logecho 还原的版本库版本信息如下: >> %REPOS_BACKUP_ROOT%SvnLoad.log:将所有保存版本库备份的文件夹名写入tmpdir /b %REPOS_BACKUP_ROOT%*.dmp > folderName.tmp:依次操作tmp文件中包含的文件夹for /f %h in (folderName.tmp) do (:将所有版本库文件名写入tmpdir /b /a-d %REPOS_BACKUP_ROOT%h*.dmp > fileName.tmp:依次操作tmp文件中包含的备份文件for /f %i in (fileName.tmp) do (:处理备份文件名,以取得版本库名和相应的版本号for /f "tokens=1,2* delims=-" %j in ("%ni") do (echo.echo 开始还原版本库%REPOS_BACKUP_ROOT%h%j-%k-%l:版本库根目录不存在和版本库名相同名字的文件夹则创建一个if not exist %REPOS_ROOT%j (mkdir %REPOS_ROOT%j):版本库根目录中该文件夹不是版本库,则创建一个if not exist %REPOS_ROOT%jconfsvnserve.conf (%SVN_CMD%svnadmin create %REPOS_ROOT%j):还原备份%SVN_CMD%svnadmin load %REPOS_ROOT%j < %REPOS_BACKUP_ROOT%h%iecho %j: %k-%l >> %REPOS_BACKUP_ROOT%SvnLoad.logecho 版本库%REPOS_BACKUP_ROOT%h%j-%k-%l还原成功!):删除临时文件del fileName.tmpdel folderName.tmpecho.echo 全部版本库还原成功!goto end:Errorecho.echo 版本库备份目录%REPOS_BACKUP_ROOT%不存在,请确认后重新运行程序!goto End:End 专心-专注-专业