研究windows下SVN备份及还原恢复方案

windows下SVN备份方案

备份策略

svn备份通常采用三种方式:

1)svnadmin dump 
    2)svnadmin hotcopy 
    3)svnsync. 

注意,svn备份不宜采用普通的文件拷贝方式(除非你备份的时候将库暂停),如copy命令、rsync命令。windows

优缺点分析:

第一种svnadmin dump是官方推荐的备份方式,优势是比较灵活,能够全量备份也能够增量备份,并提供了版本恢复机制。
缺点是:若是版本比较大,如版本数增加到数万、数十万,那么dump的过程将很是慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。
我的建议在版本数比较小的状况下使用这种备份方式。
第二种svnadmin hotcopy原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份;
优势是:备份过程较快,灾难恢复也很快;若是备份机上已经搭建了svn服务,甚至不须要恢复,只须要进行简单配置便可切换到备份库上工做。
缺点是:比较耗费硬盘,须要有较大的硬盘支持(俺的备份机有1TB空间,呵呵)。
第三种svnsync其实是制做2个镜像库,当一个坏了的时候,能够迅速切换到另外一个。不过,必须svn1.4版本以上才支持这个功能。
优势是:当制做成2个镜像库的时候起到双机实时备份的做用;
缺点是:看成为2个镜像库使用时,没办法作到“想彻底抛弃今天的修改恢复到昨晚的样子”;而看成为普通备份机制每日备份时,操做又较前2种方法麻烦。svn

svnadmin dump全量备份实现

新建一个bat文件,内容以下:测试

echo on
rem Subversion的安装目录
 rem 全部版本库的父目录
set SVN_ROOT=F:/Repositories
rem 备份的目录
set BACKUP_SVN_ROOT=G:\SVN_BAK
set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,4%%date:~5,2%%date:~8,2%
if exist %BACKUP_DIRECTORY% goto checkBack
echo 创建备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/backup.log
mkdir %BACKUP_DIRECTORY%
rem 验证目录是否为版本库,若是是则取出名称备份
for /r %SVN_ROOT% %%I in (.) do @if exist "%%I/conf/svnserve.conf"   svnadmin dump %%~fI > %BACKUP_DIRECTORY%/%%~nI
goto end
:checkBack
echo 备份目录%BACKUP_DIRECTORY%已经存在,请清空。
goto end
:end

自动将svn资源目录下的全部版本库被分到“BACKUP_SVN_ROOT年月日”目录下。
结果发现:若是版本库文件较大,则备份时间太长。本来25G的资源目录,备份以后231G,且时间为1个多小时。
image.png设计

image.png

image.png
考虑svnadmin hotcopy方式3d

svnadmin hotcopy备份实现

svnadmin hotcopy /path/to/repository /path/to/backupcode

echo on
rem Subversion的安装目录
 rem 全部版本库的父目录
set SVN_ROOT=F:/Repositories
rem 备份的目录
set BACKUP_SVN_ROOT=G:\SVN_BAK
set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%
if exist %BACKUP_DIRECTORY% goto checkBack
echo 创建备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/backup.log
mkdir %BACKUP_DIRECTORY%
rem 验证目录是否为版本库,若是是则取出名称备份
rem for /r %SVN_ROOT% %%I in (.) do @if exist "%%I/conf/svnserve.conf"   svnadmin dump %%~fI > %BACKUP_DIRECTORY%/%%~nI
for /r %SVN_ROOT% %%I in (.) do @if exist "%%I/conf/svnserve.conf" svnadmin hotcopy %%~fI %BACKUP_DIRECTORY%/%%~nI

goto end
:checkBack
echo 备份目录%BACKUP_DIRECTORY%已经存在,请清空。
goto end
:end

备份以后的文件大小和资源库大小同样。
image.pngserver

hotcopy备份恢复测试

换个测试机下载svn server,安装完成以后,拷贝某个项目版本库到测试机。【其实也能够进行本机恢复】blog

image.png

hotcopy恢复命令

svnadmin hotcopy /path/to/backup /path/to/repository资源

image.png
建立用户,受权,用小乌龟链接一下,正常能用
image.pngrem

dump 备份恢复测试

恢复命令

svnadmin load 要恢复的版本库路径及名称 < 备份文件

  • mkdir newrepos
  • svnadmin create newrepos
  • svnadmin load newrepos < backfile

必定要先建立项目资源库,而后再恢复。
受权,测试,可用。

添加定时任务

修改脚本,备份文件自动循环覆盖

set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%

修改成如下脚本【每十天会覆盖一次】

rem 设置为循环覆盖(每十天)
set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~9,1%

最终脚本

echo off
rem Subversion的安装目录
 rem 全部版本库的父目录
set SVN_ROOT=F:/Repositories
rem 备份的目录
set BACKUP_SVN_ROOT=G:\SVN_BAK
rem set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%
rem 设置为循环覆盖(每十天)
set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~9,1%

if exist %BACKUP_DIRECTORY% rmdir /s/q %BACKUP_DIRECTORY% 
echo 创建备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/backup.log
mkdir %BACKUP_DIRECTORY%
rem 验证目录是否为版本库,若是是则取出名称备份
rem for /r %SVN_ROOT% %%I in (.) do @if exist "%%I/conf/svnserve.conf"   svnadmin dump %%~fI > %BACKUP_DIRECTORY%/%%~nI
for /r %SVN_ROOT% %%I in (.) do @if exist "%%I/conf/svnserve.conf" svnadmin hotcopy %%~fI %BACKUP_DIRECTORY%/%%~nI

image.png

相关文章
相关标签/搜索