研究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

相關文章
相關標籤/搜索