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