jasmine214--love

          只有當你的內心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
          posts - 731, comments - 60, trackbacks - 0, articles - 0

          SVN完全備份和增量備份

          Posted on 2010-10-14 11:13 幻海藍夢 閱讀(16980) 評論(0)  編輯  收藏 所屬分類: 版本管理

          1, 完全備份
          最常見和簡單的備份就是直接使用拷貝命令,將版本庫目錄拷貝到備份目錄上,就可以了。但是這樣不是很安全的方式,因為如果在拷貝時版本庫發生變化,將會造成備份的結果不夠準確,失去備份的作用,為此Subversion提供了“svnadmin hotcopy”命令,可以防止這種問題。
          還記得我們的版本庫目錄嗎?
          D:\SVNROOT
          ├─project1
          │ ├─conf
          │ ├─dav
          │ ├─db
          │ │ ├─revprops
          │ │ ├─revs
          │ │ └─transactions
          │ ├─hooks
          │ └─locks
          └─project2
          ├─conf
          ├─dav
          ├─db
          │ ├─revprops
          │ ├─revs
          │ └─transactions
          ├─hooks
          └─locks

          如果要把project1備份到d:\svnrootbak目錄下,只需要運行:
          svnadmin hotcopy d:\svnroot\project1 d:\svnrootbak\project1
          2, 增量備份
          盡管完全備份非常簡單,但是也是有代價的,當版本庫非常巨大時,經常進行完全備份是不現實的,也并不必要,但是一旦版本庫在備份之間發生問題,該如何呢,這里我們就用到了增量備份。
          增量備份通常要與完全備份結合使用,就像oracle數據庫的歸檔日志,記錄著每次Subversion提交的變化,然后在需要恢復時能夠回到最新的可用狀態。在我們這個例子中我們使用的是,svnadmin dump命令進行增量的備份,使用方法是:
          svnadmin dump project1 --revision 15 --incremental > dumpfile2
          上面的命令實現了對修訂版本15進行增量的備份,其中的輸出文件dumpfile2只保存了修訂版本15更改的內容。
          為了記錄每次提交的結果,我們需要使用一項Subversion的特性--鉤子(hook),看看我們的project1目錄:
          ├─project1
          │ ├─conf
          │ ├─dav
          │ ├─db
          │ │ ├─revprops
          │ │ ├─revs
          │ │ └─transactions
          │ ├─hooks
          │ └─locks
          其中的hooks目錄里存放的就是鉤子腳本,我們在此處只使用post-commit鉤子,這個鉤子會在每次提交之后執行,為了實現我們的備份功能,我們在hooks下建立一個文件post-commit.bat,內容如下:
          echo off
          set SVN_HOME="C:\Program Files\Subversion"
          set SVN_ROOT=D:\svnroot
          set UNIX_SVN_ROOT=D:/svnroot
          set DELTA_BACKUP_SVN_ROOT=D:\svnrootbak\delta
          set LOG_FILE=%1\backup.log
          echo backup revision %2 >> %LOG_FILE%
          for /r %SVN_ROOT% %%I in (.) do if D:/svnroot/%%~nI == %1 %SVN_ROOT%\%%~nI\hooks\deltaBackup.bat %%~nI %2
          goto end
          :end
          通過這個腳本,可以實現D:\svnroot下的版本庫提交時自動增量備份到D:\svnrootbak\delta(確定這個目錄存在),其中使用的deltaBackup.bat其實可以放在任何地方,只是對腳本的svnadmin dump的包裝,內容如下:
          @echo 正在備份版本庫%2......
          %SVN_HOME%\bin\svnadmin dump %SVN_ROOT%\%1 --incremental --revision %2 >> %DELTA_BACKUP_SVN_ROOT%\%1.dump
          @echo 版本庫%2成功備份到了%3!
          以上兩個腳本可以直接拷貝到project2的hooks目錄下,不需要修改就可以實現project2的自動備份。
          以上的操作已經OK了,現在需要做的是將完全備份和增量備份結合起來,也就是在完全備份后清理增量備份的結果,使之只保存完全備份后的結果。
          當果真出現版本庫的故障,就要求我們實現版本庫的恢復操作了,這是用要使用svnadmin load命令,同時也需要上次的完全備份例如要把上次完全備份backuprepo,和之后的增量備份dumpfile:
          svnadmin load backuprepo < dumpfile
          最后的結果,可以下載svnroot.rar,將之解壓縮到d:\下,然后修改幾個bat文件的SVN_HOME就可以使用了。
          3, 版本庫同步
          Subversion 1.4增加了同步機制,可以實現一個版本庫同另一個版本庫的同步(但好像只是單向的),我們可以用來實現版本庫的備份或鏡像。
          3.1. 對目標庫初始化
          svnsync init svn://localhost/project2 svn://localhost/project1

          其中project2是目標的版本庫,而project1是源版本庫。其中的目標版本庫必須為空,而且必須允許修訂版本屬性的修改,也就是在目標的版本庫的hooks目錄里添加一個文件pre-revprop-change.bat,內容為空即可。
          3.2. 同步project2到project1
          svnsync sync svn://localhost/project2

          這時候你update一下你的project2的一個工作拷貝,就會發現有了project1的所有內容。如果project1又有提交,這時候 project2的版本庫無法看到最新的變化,還需要再運行一遍sync操作,這樣才能將最新的變化同步。需要注意的是,目標版本庫只能做成只讀的,如果目標版本庫發生了變更,則無法繼續同步了。
          3.3. 同步歷史屬性的修改
          因為同步不會更新對歷史屬性的修改,所以svnsync還有子命令copy-revprops,可以同步某個版本的屬性。
          3.4. 鉤子自動同步
          希望在每次提交時同步,則需要在源版本庫增加post-commit腳本,內容如下:
          echo off
          set SVN_HOME="D:\Subversion"
          %SVN_HOME%\bin\svnsync sync --non-interactive svn://localhost/project2

          把以上內容存放為post-commit.bat,然后放到版本庫project1下的hooks目錄下,這樣project1每次提交,都會引起project2的同步。


          一直用這套腳本備份,腳本主體雖不是原創,但是從網上得到后因為不能運行也進行了些修改,前兩天看到有人問關于SVN備份的問題,今天又把腳本整理了一下,解決了不能循環備份多個配置庫的問題。希望對大家有所幫助。在此也謝謝提供腳本主體的高人。wscthjeyrt
          我的備份策略是一個月一次全備份,一周一次增量備份,并且每天也進行增量備份,在Window任務里設置定時進行,設置好后就不用管了,再加一層保險就是定期把備份文件移到另外一臺機器存儲。wscthjeyrt
          (一)全備份,包含兩個文件hotcopy.bat和最終執行文件fullbackup.batwscthjeyrt
          1) hotcopy.batwscthjeyrt
          @echo 正在備份版本庫%1……wscthjeyrt
          rem @%SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2wscthjeyrt
          @%SVN_HOME%\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2wscthjeyrt
          @echo 版本庫%1成功備份到了%2!wscthjeyrt
          wscthjeyrt
          wscthjeyrt
          2)fullbackup.batwscthjeyrt
          echo offwscthjeyrt
          rem Subversion的安裝目錄wscthjeyrt
          rem set SVN_HOME="F:\Program Files\Subversion"wscthjeyrt
          set SVN_HOME="F:\Program Files\CollabNet Subversion Server"wscthjeyrt
          rem 所有版本庫的父目錄wscthjeyrt
          set SVN_ROOT=G:\SVNwscthjeyrt
          rem 備份的目錄wscthjeyrt
          set BACKUP_SVN_ROOT=h:\svnrootbakwscthjeyrt
          set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,10%wscthjeyrt
          wscthjeyrt
          if exist %BACKUP_DIRECTORY% goto checkBackwscthjeyrt
          echo 建立備份目錄%BACKUP_DIRECTORY%>>%SVN_ROOT%/fullbackup.logwscthjeyrt
          mkdir %BACKUP_DIRECTORY%wscthjeyrt
          rem 驗證目錄是否為版本庫,如果是則取出名稱備份wscthjeyrt
          for /r %SVN_ROOT% %%I in (.) do @if exist "%%I\conf\svnserve.conf" hotcopy.bat "%%~fI" %%~nIwscthjeyrt
          goto endwscthjeyrt
          :checkBackwscthjeyrt
          echo 備份目錄%BACKUP_DIRECTORY%已經存在,請清空。wscthjeyrt
          goto endwscthjeyrt
          :endwscthjeyrt
          wscthjeyrt
          wscthjeyrt
          (二)增量備份,包含三個文件,dump.bat、最終執行文件svndump.bat和配置庫名稱配置projectlist.confwscthjeyrt
          1)dump.batwscthjeyrt
          @ECHO OFFwscthjeyrt
          rem 調用格式:dump 項目庫名wscthjeyrt
          if "%1"=="" goto no_argswscthjeyrt
          set PROJECT=%1wscthjeyrt
          if not exist %RAR_STORE%\%PROJECT% mkdir %RAR_STORE%\%PROJECT%wscthjeyrt
          cd %RAR_STORE%\%PROJECT%wscthjeyrt
          SET LOWER=0wscthjeyrt
          SET UPPER=0wscthjeyrt
          wscthjeyrt
          @echo 項目庫%PROJECT%2...>> %Log_PATH%\%PROJECT%_log.txtwscthjeyrt
          %SVN_LOOK% youngest %SVN_REPOROOT%\%PROJECT%> %Log_PATH%\A.TMPwscthjeyrt
          @echo 項目庫%PROJECT%3...>> %Log_PATH%\%PROJECT%_log.txtwscthjeyrt
          @FOR /f %%D IN (%Log_PATH%\A.TMP) DO set UPPER=%%Dwscthjeyrt
          if %UPPER%==0 GOTO :N_EXITwscthjeyrt
          if not exist %Log_PATH%\%PROJECT%_last_revision.txt GOTO :BAKUPwscthjeyrt
          rem 取出上次備份后的版本號,并做+1處理(注意此算法未在98系統驗證)wscthjeyrt
          @FOR /f %%C IN (%Log_PATH%\%PROJECT%_last_revision.txt) DO @set LOWER=%%Cwscthjeyrt
          @set /A LOWER=%LOWER%+1wscthjeyrt
          rem 不需要備份,則跳轉結束wscthjeyrt
          IF %LOWER% gtr %UPPER% GOTO :N_EXITwscthjeyrt
          wscthjeyrt
          :BAKUPwscthjeyrt
          SET FILENAME=%PROJECT%_%LOWER%_%UPPER%wscthjeyrt
          @ECHO 開始備份項目庫:%PROJECT%,生成文件=%FILENAME%wscthjeyrt
          %SVN_ADMIN% dump %SVN_REPOROOT%\%PROJECT% -r %LOWER%:head --incremental >%FILENAME%.dmpwscthjeyrt
          rem %RAR_CMD% a -df %PROJECT%_%UPPER%.rar %wscthjeyrt
          rem 準備寫備份日志信息wscthjeyrt
          IF %LOWER% gtr 0 GOTO :WRITENOTEwscthjeyrt
          @ECHO ------2-----%date% >> %Log_PATH%\%PROJECT%_log.txtwscthjeyrt
          @echo -- 3-------添加備份文件 %PROJECT%_%UPPER%.rar,從[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txtwscthjeyrt
          GOTO :COMPLETEwscthjeyrt
          wscthjeyrt
          :WRITENOTEwscthjeyrt
          @ECHO %date% >> %Log_PATH%\%PROJECT%_log.txtwscthjeyrt
          @echo -- 4------添加增量備份文件 %PROJECT%_%UPPER%.rar,從[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txtwscthjeyrt
          wscthjeyrt
          :COMPLETEwscthjeyrt
          rem 下面一行用于拷貝備份文件到映射的驅動器上wscthjeyrt
          rem copy %PROJECT%.rar %RAR_STORE%\%PROJECT%\wscthjeyrt
          move %FILENAME%.dmp %RAR_STORE%\%PROJECT%\wscthjeyrt
          del %Log_PATH%\A.TMPwscthjeyrt
          @echo %UPPER% > %Log_PATH%\%PROJECT%_last_revision.txtwscthjeyrt
          wscthjeyrt
          :N_EXITwscthjeyrt
          @echo 項目庫%PROJECT%處理結束...>> %Log_PATH%\%PROJECT%_log.txtwscthjeyrt
          @CD..wscthjeyrt
          @exit /Bwscthjeyrt
          :no_argswscthjeyrt
          @ECHO ONwscthjeyrt
          @echo "正確調用方法: dump 項目庫名"wscthjeyrt
          wscthjeyrt
          wscthjeyrt
          2)svndump.bat wscthjeyrt
          echo offwscthjeyrt
          rem Subversion的安裝目錄及執行文件wscthjeyrt
          set SVN_HOME="F:\Program Files\CollabNet Subversion Server"wscthjeyrt
          set SVN_ADMIN=%SVN_HOME%\svnadmin.exewscthjeyrt
          set SVN_LOOK=%SVN_HOME%\svnlook.exewscthjeyrt
          rem 配置庫倉庫根目錄wscthjeyrt
          set SVN_REPOROOT=G:\SVNwscthjeyrt
          rem 壓縮命令wscthjeyrt
          set RAR_CMD="E:\Progra~1\WinRAR\WinRAR"wscthjeyrt
          rem 增量備份文件存放路徑wscthjeyrt
          set RAR_STORE="H:\svnincrementW"wscthjeyrt
          rem 日志及最后一次備份修訂號存放文件目錄,以下是跟增量備份腳本目錄同一目錄wscthjeyrt
          set Log_PATH=G:\backup\incrementWwscthjeyrt
          wscthjeyrt
          @echo 項目庫%PROJECT%處理1...>> %Log_PATH%\%PROJECT%_log.txtwscthjeyrt
          rem 讀取項目庫列表文件,并忽略其中;開頭的行wscthjeyrt
          FOR /f "eol=;" %%C IN (projectlist.conf) DO call G:\backup\incrementW\dump.bat %%Cwscthjeyrt
          wscthjeyrt
          wscthjeyrt
          3)projectlist.confwscthjeyrt
          ;**************************************************wscthjeyrt
          ;01. project1開發庫wscthjeyrt
          ; 更新頻率: 高wscthjeyrt
          ;**************************************************wscthjeyrt
          PROJECT1wscthjeyrt
          ;**************************************************wscthjeyrt
          ;02. 此處可寫注釋信息wscthjeyrt
          ;**************************************************wscthjeyrt
          PROJECT2wscthjeyrt
          PROJECT3wscthjeyrt
          PROJECT4wscthjeyrt
          PROJECT5wscthjeyrt

          原文:http://hi.baidu.com/gacmotor/blog/item/1865e46f6a038fd280cb4ae5.html
          主站蜘蛛池模板: 阳信县| 邛崃市| 富宁县| 永平县| 高密市| 景德镇市| 沁水县| 永春县| 泰和县| 泗水县| 山东省| 南皮县| 库车县| 嘉峪关市| 简阳市| 秀山| 宣汉县| 通许县| 长子县| 南岸区| 吉木萨尔县| 三河市| 汉寿县| 曲周县| 武陟县| 马边| 龙泉市| 云阳县| 巧家县| 泰顺县| 万载县| 秭归县| 石渠县| 桃园市| 灵武市| 三都| 汶川县| 商丘市| 平定县| 砚山县| 合肥市|