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
新建一个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个多小时。
设计
考虑svnadmin hotcopy方式
3d
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
备份以后的文件大小和资源库大小同样。
server
换个测试机下载svn server,安装完成以后,拷贝某个项目版本库到测试机。【其实也能够进行本机恢复】blog
svnadmin hotcopy /path/to/backup /path/to/repository资源
建立用户,受权,用小乌龟链接一下,正常能用
rem
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