posts - 262,  comments - 221,  trackbacks - 0
          【1.業務需求】
          作為開發人員,最大的噩夢莫過于自己辛辛苦苦開發的程序由于各種原因而丟失了。所以定期備份資料乃是開發人員的一大美德(我自己重要的資料備份了4份,分別放在不同的地方)。SVN作為代碼和文檔匯聚之地,定期備份的重要性更是不容置疑。

          【2.基本思路】
          通常我們備份的方式無非有:完全備份和增量備份兩種。完全備份適用于版本庫的大小比較小的情況,對于版本庫比較大或者已經存在版本庫的情況下,則沒有必要也不可能使用完全備份了。這時增量備份就是一個很好的選擇。

          除了完全備份和增量備份,我們還有另外一種方式:版本庫同步。這種方法可以在源版本庫和目標版本庫之間做同步(通常是單向的)。一旦源版本庫發生了改變則可以馬上通知目標版本庫做出相同的改變。

          注意:版本庫的備份不能簡單地使用copy-paste的方法來拷貝復雜版本庫的db目錄,否則有可能出現數據不完全的情況。

          所以我們的備份策略是:
           ①首次備份采用完全備份,后續備份采用增量備份和版本庫同步
           ②完全備份在晚上定時進行,增量備份和版本庫同步在用戶提交時進行

          注意:這個策略實際上是有較大問題的(包括備份的方式,頻度,時間):通常完全備份會在每周,月進行一次。而增量備份會,版本庫同步會在每天晚上定時執行,而不是在每次用戶提交后執行,以縮短請求響應。但這里因為本著簡單的原則,只是抽取了最簡單的策略

          【3.相關命令】
          SVN用于備份的命令有以下三個,分別對應于完全備份,增量備份,版本庫同步。

           ①svnadmin hotcopy
           ②svnadmin dump [--incremental]
           ③svnsync init|sync

          關于這三個命令的具體用法,請大家自行參考SVN的用戶手冊以獲得更多資訊。

          【4.示例操作】
          注:本示例代碼均為網上下載,非本人原創。

          Example 1:完全備份

          fullbackup.bat
          @echo off

          @echo 不同的系統平臺和時間格式設置會影響目錄的創建,請先用echo命令輸出日期格式并做相應調整

          rem Subversion的安裝目錄
          set SVN_HOME=C:\Develop\Subversion

          rem 所有版本庫的父目錄
          set SVN_ROOT=C:\Develop\svntest\testRepos

          rem 備份的根目錄
          set BACKUP_SVN_ROOT=C:\Develop\svntest\svnbackup\full

          rem 每次備份的子目錄
          set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~4,14%

          rem 如果備份的子目錄不存在則先創建
          if exist %BACKUP_DIRECTORY% goto checkBack
          echo 建立備份目錄%BACKUP_DIRECTORY%
          >>%BACKUP_SVN_ROOT%/backup.log
          mkdir %BACKUP_DIRECTORY%

          rem 驗證目錄是否為版本庫,如果是則取出名稱備份
          for /r %SVN_ROOT% %%I in (.) do @if exist "%%I\conf\svnserve.conf" %SVN_ROOT%\dofullBackup.bat "%%~fI" %%~nI
          goto end

          :checkBack
          echo 備份目錄%BACKUP_DIRECTORY%已經存在,請清空。
          goto end
          :
          end

          dofullbackup.bat
          @echo 正在備份版本庫%1
          @%SVN_HOME%
          \bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2
          @echo 版本庫%1成功備份到了%
          2!

          由于批處理文件中%date命令的輸出格式受平臺的控制(實際上是控制面板中的時區設置)影響,所以對于文件中使用到date函數的地方,讀者要特別注意。需要首先在DOS下確認日期輸出格式,然后根據實際情況進行截取。

          將這兩個文件放在repository的同級目錄下,執行之則可以。讀者可以自行修改上面的環境變量設置

          Example 2:增量備份

          post-commit.bat
          echo off

          set SVN_HOME=C:\Develop\Subversion
          set SVN_ROOT=C:\Develop\svntest\testRepos
          set UNIX_SVN_ROOT=C:/Develop/svntest/testRepos
          set DELTA_BACKUP_SVN_ROOT=C:\Develop\svntest\svnbackup\delta
          set LOG_FILE=%DELTA_BACKUP_SVN_ROOT%\backup.log

          @echo 不同的系統平臺和時間格式設置會影響目錄的創建,請先用echo命令輸出日期格式并做相應調整

          rem  版本庫增量導出
          for /r %SVN_ROOT% %%I in (.) do  if %UNIX_SVN_ROOT%/%%~nI== %1 echo 備份開始  版本路徑:%SVN_ROOT%\%%~nI  版本號:%2 >>  %LOG_FILE% | %SVN_ROOT%\%%~nI\hooks\deltaBackup.bat %%~nI %2
          goto end

          :
          end

          這個批處理文件的重點在于%UNIX_SVN_ROOT%/%%~nI == %1這句話。它的作用是判斷當前提交的目標版本庫是不是和循環中的變量值相同,如果是那么認為該修改是提交到這個版本庫的,就可以進行增量備份了。我在運行這個文件時,一開始老是失敗,后來發現原因居然是路徑的寫法問題。

          請注意UNIX_SVN_ROOT這個變量的路徑值寫法,如果你換成SVN_ROOT看看,肯定是不會成功的。因為路徑的寫法不同! 

          deltaBackup.bat
          @echo 正在備份版本庫%2 
          @%SVN_HOME%
          \bin\svnadmin dump %SVN_ROOT%\%1 --incremental --revision %2 >> %DELTA_BACKUP_SVN_ROOT%\%1-%date:~4,14%.dump
          @echo 版本庫%2成功備份到了%
          3!

          這個文件里面特別要注意的就是--incremental這個參數,如果你不加上去的話以后再執行load就會提示版本庫已經存在的錯誤了!而--revision則用于指定備份的版本。

          將以上兩個文件放置在repository的hooks目錄下即可。

          Example 3:版本庫同步

          首先創建一個版本庫用于同步(目標版本庫),其次要在源版本庫和目標版本庫之間建立聯系。這是通過svnsync init來達到的。

          svnsync init 目標庫URL 源庫URL

          這個命令執行過程中可能需要增加兩個參數--username和--password用于指明目標版本庫的用戶名和密碼。

          其次在目標版本庫的hooks目錄下建立一個空的文件并命名為pre-revprop-change.bat。這一步很重要,否則會出現鑒權失敗的錯誤。最后就是在源版本庫的hooks目錄下建立一個名為post-commit.bat的文件,如下所示:

          echo off

          rem 版本庫同步
          %SVN_HOME%\bin\svnsync sync  --non-interactive svn://localhost/newRepo_backup

          但用戶在源版本庫執行了相應的修改動作之后,你會發現目標版本庫也出現了同樣的修改!

          附件:完整測試目錄及腳本文件


          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2008-12-30 17:35 Paul Lin 閱讀(2489) 評論(5)  編輯  收藏 所屬分類: 項目管理


          FeedBack:
          # re: 【版本控制之路】版本庫的備份
          2008-12-30 19:04 | 激情
          just test!!!  回復  更多評論
            
          # re: 【版本控制之路】版本庫的備份
          2008-12-31 20:00 | 夢想在這里起飛
          寫得不錯啊,看看我這個
          開源的報表ireport項目web應用
          http://ireport.cubebi.com


            回復  更多評論
            
          # re: 【版本控制之路】版本庫的備份[未登錄]
          2009-01-01 11:01 | Paul Lin
          @夢想在這里起飛

          支持國產軟件,很不錯!
            回復  更多評論
            
          # re: 【版本控制之路】版本庫的備份
          2009-01-02 11:43 | 愛吃魚頭
          svn很重要!備份很重要!向lz學習了!  回復  更多評論
            
          # re: 【版本控制之路】版本庫的備份
          2010-03-30 11:01 | 醉月茶
          很好,拜讀了~  回復  更多評論
            
          <2008年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 通榆县| 耿马| 五寨县| 清水县| 贵州省| 上蔡县| 黔西| 南阳市| 岳普湖县| 兴宁市| 兴文县| 肇州县| 丹东市| 枝江市| 三明市| 鄱阳县| 庄河市| 丰镇市| 宁国市| 新兴县| 台安县| 崇文区| 左贡县| 博爱县| 丘北县| 盱眙县| 多伦县| 文昌市| 鲁山县| 沧源| 来宾市| 法库县| 雷山县| 云林县| 南召县| 陆河县| 敦煌市| 克什克腾旗| 齐齐哈尔市| 崇礼县| 中宁县|