SVN在Windows下实现自动全量增量备份和异地备份
1SVN备份介绍
1.1SVN备份内容
SVN在Windows下的自动备份实现,包括:
1)SVN目录的全备份(1周或1个月备份1次,由windows计划来调度执行);
2)SVN增量备份(每日备份1次,由windows计划来调度执行);
1.2SVN备份流程
上述2类备份分别进行的流程如下:
1)通过windows定时任务功能,调度进行备份、压缩、FTP上传功能的bat文件;
2)将自动备份成按每日日期.dmp备份到SVN本机的其他磁盘空间中,分全备份和增量备份;
3)启动ftp上传命令,将备份的rar包立即上传在异地服务器上。异地服务器需提前架好ftp服务器并建立好相关上传目录,建议使用用、serverU或者简单ftp软件进行搭建。
4)整个上传过程,详细记录备份、压缩、FTP上传各步骤详细日志,随时可以查阅每次备份记录的详细情况。
1.3SVN还原功能
可以进行还原所有版本库
2SVN备份BAT设计
1.1全备份BAT
1)SVN的全备份,AllBackUp.bat
:Begin
@echo off
setlocal enabledelayedexpansion
echo 正在准备备份所有版本库……
echo.
::设置SVN命令目录
set SVN_CMD="E:\VisualSVN Server\bin"
::设置所有版本库根目录
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%.dmp
set BACKUP_DIRECTORY=%BACKUP_DIRECTORY:/=-%
rem if exist %BACKUP_DIRECTORY% goto Error2
rem mkdir %BACKUP_DIRECTORY%
if not exist %BACKUP_DIRECTORY% mkdir %BACKUP_DIRECTORY%
::设置用户权限信息备份目录
set REPOS_USER_INFO_DIRECTORY=%BACKUP_DIRECTORY%\UserInfo
if not exist %REPOS_USER_INFO_DIRECTORY% mkdir %REPOS_USER_INFO_DIRECTORY%
::备份所有版本库
::i->版本库、j->版本库最新版本号、k->上次完全备份时版本库的版本号
echo ===================%date% %time:~0,8%:执行全部全量备份版本
库.=================== >> %REPOS_BACKUP_ROOT%\BackUp.log
echo 备份的版本库版本信息如下: >> %REPOS_BACKUP_ROOT%\BackUp.log
::读取版本库根目录下每个文件夹,并判断其是否是一个版本库
for /r %REPOS_ROOT% %%i in (.) do if exist %%i\conf\svnserve.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.dmp
echo %time:~0,8% %%~ni: 0-%%j >> %REPOS_BACKUP_ROOT%\BackUp.log
echo 版本库%%~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.log echo.
echo 用户权限信息备份成功!
echo %time:~0,8% 用户权限信息备份成功! >> %REPOS_BACKUP_ROOT%\BackUp.log echo.
echo 全部版本库备份成功!
echo %time:~0,8% 全部版本库备份成功! >> %REPOS_BACKUP_ROOT%\BackUp.log
AllBackupByFtp
goto end
:Error2
echo.
echo 备份目录已经存在,请确认后删除该目录,重新运行程序!
goto End
:End
echo.
echo 程序执行结束!
2)SVN的全备份进行FTP上传,AllBackupBy
@echo off
REM ======设置区Start================================
set
set
set .1.22
set
REM 指定从FTP下载下来的文件存放到本机哪个目录
set 全备份
REM 本地需要备份的根目录
set SvnBackupRoot=F:\[SvnBackup]\全备份
REM 本地需要打压缩包的备份目录(今天备份文件夹2016-01-01.dmp)
set SvnBackupFolder=%SvnBackupRoot%\%date:~0,10%.dmp
REM 需要压缩成的文件路径及文件名(今天备份上传文件2016-01-01.dmp.rar)set rarTo
REM RAR执行文件的路径
set rarExePath="C:\Program Files\WinRAR\"
REM RAR执行文件的路径
set bakupLog\BackUp.log
REM FTP命令执行文件缓存
set \Temp
>"%" (
echo,open % %
echo,%
echo,%
echo cd "%"
echo prompt off
echo bin
echo put %rarTo
echo put %bakupLog
echo bye
)
set Path=%Path%;%rarExePath%
set log\
REM ======设置区End ================================
echo ===================%date% 执行异地版本库全量备份开始
================= >> %log
if not exist %SvnBackupFolder% goto Error1
echo %time:~0,8% 备份压缩开始... >> %log
WinRAR.exe a -ep1 -k -r -s -ibck %rarTo %SvnBackupFolder%
echo %time:~0,8% 备份压缩成功,压缩的文件路径为:%rarTo >> %log
echo %time:~0,8% 备份压缩继续上传FTP开始... >> %log
-i -s:"%"
echo %time:~0,8% 上传FTP成功,上传FTP目录为:% >> %log
del /q /s /f %rarTo
echo. >> %log
goto end
:Error1
echo.
echo %time:~0,8% 提示: 需要进行压缩打包的备份文件夹%SvnBackupFolder%不存在,请确认SVN是否本地备份完成! >> %log
echo %time:~0,8% 备份失败! >> %log
echo. >> %log
echo 提示:
echo 需要进行压缩打包的备份文件夹%SvnBackupFolder%不存在,请确认SVN是否本地备份完成!
:End
echo.
echo 程序执行结束!
1.2增量备份BAT
1)SVN数据库的增量备份,IncreBackUp.bat
if not exist %REPOS_BACKUP_ROOT% mkdir %REPOS_BACKUP_ROOT%
::获取LastRevisions目录
set REPOS_LAST_REVERSION_DIRECTORY=%REPOS_BACKUP_ROOT%\LastRevisions
rem 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%.dmp
set BACKUP_DIRECTORY=%BACKUP_DIRECTORY:/=-%
rem if exist %BACKUP_DIRECTORY% goto Error2
rem mkdir %BACKUP_DIRECTORY%
if not exist %BACKUP_DIRECTORY% mkdir %BACKUP_DIRECTORY%
::设置用户权限信息备份目录
set REPOS_USER_INFO_DIRECTORY=%BACKUP_DIRECTORY%\UserInfo
if not exist %REPOS_USER_INFO_DIRECTORY% mkdir %REPOS_USER_INFO_DIRECTORY%
::设置LastRevisions备份目录
set REPOS_LAST_REVERSION_BACKUP_DIRECTORY=%BACKUP_DIRECTORY%\LastRevisions if 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.log
echo 备份的版本库版本信息如下: >> %REPOS_BACKUP_ROOT%\BackUp.log
::读取版本库根目录下每个文件夹,并判断其是否是一个版本库
for /r %REPOS_ROOT% %%i in (.) do if exist %%i\conf\svnserve.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=%%k
set /a version=!version!+1
::增量备份版本库
%SVN_CMD%\svnadmin dump --deltas %%~fi --revision !version!:head --incremental > %BACKUP_DIRECTORY%\%%~ni-!version!-%%j.dmp
echo %%~ni: !version!-%%j >> %REPOS_BACKUP_ROOT%\BackUp.log
echo 版本库%%~ni已经成功备份到%BACKUP_DIRECTORY%\%%~ni-!version!-%%j.dmp! )
) else (
echo.
echo 开始备份版本库%%~ni……
::全量备份版本库
%SVN_CMD%\svnadmin dump --deltas %%~fi > %BACKUP_DIRECTORY%\%%~ni-0-%%j.dmp echo %%~ni: 0-%%j >> %REPOS_BACKUP_ROOT%\BackUp.log
echo 版本库%%~ni已经成功备份到%BACKUP_DIRECTORY%\%%~ni-0-%%j.dmp!
)
::将本次版本库备份时的最新版本信息写入文件保存
echo %%j> %REPOS_LAST_REVERSION_DIRECTORY%\%%~ni_last_revision.txt
echo %%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 全部版本库备份成功!
IncreBackupByFtp
goto end
:Error1
echo.
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
)
:Error2
echo.
echo 备份目录已经存在,请确认后删除该目录,重新运行程序!
goto End
:End
echo.
echo 程序执行结束!
2)SVN数据的增量备份的FTP上传,IncreBackupBy
@echo off
REM ======设置区Start================================
set
set
set .1.22
set
REM 指定从FTP下载下来的文件存放到本机哪个目录
set 增量备份
REM 本地需要备份的根目录
set SvnBackupRoot=F:\[SvnBackup]\增量备份
REM 本地需要打压缩包的备份目录(今天备份文件夹2016-01-01.dmp)
set SvnBackupFolder=%SvnBackupRoot%\%date:~0,10%.dmp
REM 需要压缩成的文件路径及文件名(今天备份上传文件2016-01-01.dmp.rar)
set rarTo
REM RAR执行文件的路径
set rarExePath="C:\Program Files\WinRAR\"
REM RAR执行文件的路径
set bakupLog\BackUp.log
REM FTP命令执行文件缓存
set \Temp
>"%" (
echo,open % %
echo,%
echo,%
echo cd "%"
echo prompt off
echo bin
echo put %rarTo
echo put %bakupLog
echo bye
)
set Path=%Path%;%rarExePath%
set log\
REM ======设置区End ================================
echo ===================%date% 执行异地版本库增量备份开
始.=================== >> %log
if not exist %SvnBackupFolder% goto Error1
echo %time:~0,8% 备份压缩开始... >> %log
WinRAR.exe a -ep1 -k -r -s -ibck %rarTo %SvnBackupFolder%
echo %time:~0,8% 备份压缩成功,压缩的文件路径为:%rarTo >> %log
echo %time:~0,8% 备份压缩继续上传FTP开始... >> %log
-i -s:"%"
echo %time:~0,8% 上传FTP成功,上传FTP目录为:% >> %log
del /q /s /f %rarTo
echo. >> %log
goto end
:Error1
echo.
echo %time:~0,8% 提示: 需要进行压缩打包的备份文件夹%SvnBackupFolder%不存在,请确认SVN是否本地备份完成! >> %log
echo %time:~0,8% 备份失败! >> %log
echo. >> %log
echo 提示:
echo 需要进行压缩打包的备份文件夹%SvnBackupFolder%不存在,请确认SVN是否本地备份完成!
:End
echo.
3SVN还原BAT设计
SVN的还原LoadBackUp.bat
@echo off
echo 正在准备还原所有版本库……
echo.
::设置SVN命令目录
set SVN_CMD="E:\VisualSVN Server\bin"
::设置所有版本库根目录
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.log
echo 还原的版本库版本信息如下: >> %REPOS_BACKUP_ROOT%\SvnLoad.log
::将所有保存版本库备份的文件夹名写入tmp
dir /b %REPOS_BACKUP_ROOT%\*.dmp > folderName.tmp
::依次操作tmp文件中包含的文件夹
for /f %%h in (folderName.tmp) do (
::将所有版本库文件名写入tmp
dir /b /a-d %REPOS_BACKUP_ROOT%\%%h\*.dmp >
::依次操作tmp文件中包含的备份文件
for /f %%i in () 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%\%%j\conf\svnserve.conf (
%SVN_CMD%\svnadmin create %REPOS_ROOT%\%%j
)
::还原备份
%SVN_CMD%\svnadmin load %REPOS_ROOT%\%%j < %REPOS_BACKUP_ROOT%\%%h\%%i echo %%j: %%k-%%l >> %REPOS_BACKUP_ROOT%\SvnLoad.log
echo 版本库%REPOS_BACKUP_ROOT%\%%h\%%j-%%k-%%l还原成功!
)
)
)
::删除临时文件
del
del folderName.tmp
echo.
echo 全部版本库还原成功!
goto end
:Error
echo.
echo 版本库备份目录%REPOS_BACKUP_ROOT%不存在,请确认后重新运行程序! goto End
:End