1. 程式人生 > >研究windows下SVN備份及還原恢復方案

研究windows下SVN備份及還原恢復方案

director 不能 下載 正常 做到 小時 工作 取出 visual

windows下SVN備份方案

備份策略

svn備份一般采用三種方式:

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

註意,svn備份不宜采用普通的文件拷貝方式(除非你備份的時候將庫暫停),如copy命令、rsync命令。

優缺點分析:

第一種svnadmin dump是官方推薦的備份方式,優點是比較靈活,可以全量備份也可以增量備份,並提供了版本恢復機制。
缺點是:如果版本比較大,如版本數增長到數萬、數十萬,那麽dump的過程將非常慢;備份耗時,恢復更耗時;不利於快速進行災難恢復。
個人建議在版本數比較小的情況下使用這種備份方式。

第二種svnadmin hotcopy原設計目的估計不是用來備份的,只能進行全量拷貝,不能進行增量備份;
優點是:備份過程較快,災難恢復也很快;如果備份機上已經搭建了svn服務,甚至不需要恢復,只需要進行簡單配置即可切換到備份庫上工作。
缺點是:比較耗費硬盤,需要有較大的硬盤支持(俺的備份機有1TB空間,呵呵)。
第三種svnsync實際上是制作2個鏡像庫,當一個壞了的時候,可以迅速切換到另一個。不過,必須svn1.4版本以上才支持這個功能。
優點是:當制作成2個鏡像庫的時候起到雙機實時備份的作用;
缺點是:當作為2個鏡像庫使用時,沒辦法做到“想完全拋棄今天的修改恢復到昨晚的樣子”;而當作為普通備份機制每日備份時,操作又較前2種方法麻煩。

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個多小時。
技術分享圖片

技術分享圖片

技術分享圖片
考慮svnadmin hotcopy方式

svnadmin hotcopy備份實現

svnadmin hotcopy /path/to/repository /path/to/backup

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

備份之後的文件大小和資源庫大小一樣。
技術分享圖片

hotcopy備份恢復測試

換個測試機下載svn server,安裝完成之後,拷貝某個項目版本庫到測試機。【其實也可以進行本機恢復】

技術分享圖片

hotcopy恢復命令

svnadmin hotcopy /path/to/backup /path/to/repository

技術分享圖片
創建用戶,授權,用小烏龜連接一下,正常能用
技術分享圖片

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

技術分享圖片

研究windows下SVN備份及還原恢復方案