搜档网
当前位置:搜档网 › Svn在Windows下实现自动全量增量备份和异地备份

Svn在Windows下实现自动全量增量备份和异地备份

Svn在Windows下实现自动全量增量备份和异地备份
Svn在Windows下实现自动全量增量备份和异地备份

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

相关主题