工作隨筆——使用svnsync實時備份SVN版本庫


前段時間把SVN版本庫從win遷移到了Linux上,沒隔幾天那台win的磁盤就嚴重壞道了。。。。這TMD什么運氣!

花費了點時間研究了下svn自己的同步工具。寫個日志記錄下。

注意:svnsync要求svn版本1.4+

 

下面的內容來自svnbook-1.4
svnsync svnsync是Subversion的遠程版本庫鏡像工具,它允許你把一個版本庫的內容錄入到另一個。 在任何鏡像場景中,有兩個版本庫:源版本庫,鏡像(或“sink”)版本庫,源版本庫就是svnsync獲取修訂版本的庫,鏡像版本庫是源版本庫修訂版本的目標,兩個版本庫可以是在本地或遠程—它們只是通過URL跟蹤。 svnsync進程只需要對源版本庫有讀權限;它不會嘗試修改它。但是很明顯,svnsync可以讀寫訪問鏡像版本庫。 警告 svnsync對於不能作為鏡像操作一部分的修改非常敏感,為了防止發生這個情況,最好保證svnsync是唯一可以修改鏡像版本庫的進程。 svnsync選項
--config-dir DIR 指導Subversion從指定目錄而不是默認位置(用戶主目錄的.subversion)讀取配置信息。 --no-auth-cache 阻止在Subversion管理區緩存認證信息(如用戶名密碼)。 --non-interactive 如果認證失敗,或者是不充分的憑證時,防止出現要求憑證的提示(例如用戶名和密碼)。這在運行自動腳本時非常有用,只是讓Subversion失敗而不是提示更多的信息。 --password PASS 指出在命令行中提供你的密碼—另外,如果它是需要的,Subversion會提示你輸入。 --username NAME 表示你要在命令行提供認證的用戶名—否則如果需要,Subversion會提示你這一點。

 

 

來源SVN:192.168.2.5

 

備份SVN:192.168.3.10

 

  1. 創建備份空版本庫
    $ svnadmin create svn-mirror
  2.  配置來源、備份SVN,創建用戶:syncuser

     請確認syncuser用戶對備份SVN有寫入權限。對來源SVN有讀取權限。且密碼相同。

  3. 配置備份SVN的pre-revprop-change hook
    #!/bin/sh 
    
    USER="$3"
    
    # 限制只有syncuser用戶才能提交版本屬性修改到此版本庫
    if [ "$USER" = "syncuser" ]; then exit 0; fi 
    
    echo "Only the syncuser user may change revision properties" >&2
    exit 1
    
    # 當然某些網絡教程說的是你可以直接清空然后寫入exit 0 ,這種方法雖然可以做,但是注意svnbook中的這句話:
    # svnsync的通訊議對於源和目標版本庫版本歷史的不一致非常敏感,因此,雖然svnsync無法要求目標版本庫是只讀的,[34]最好的辦法就是只允許鏡像進程修改目標版本庫內容。(PS:鏡像==來源SVN  目錄==備份SVN)
    
    # [34] 實際上,它不是真的完全只讀,或者svnsync本身有時間將版本庫歷史拷入。
  4.  配置備份SVN的start-commit hook【可選,但建議配上】

    #!/bin/sh 
    
    USER="$2"
    
    # 限制只用syncuser用戶才能提交版本修改到版本庫
    if [ "$USER" = "syncuser" ]; then exit 0; fi
    
    echo "Only the syncuser user may commit new revisions" >&2
    exit 1
  5.  初始化備份SVN

    $ svnsync initialize http://192.168.3.10/svn-mirror \
                         http://192.168.2.5/Dev-rep \
                         --username syncuser --password syncpass
    Copied properties for revision 0.
    
    # initialize 可以簡寫為 init 所以上面的命令可以寫作如下:
    $ svnsync init http://192.168.3.10/svn-mirror \
                         http://192.168.2.5/Dev-rep \
                         --username syncuser --password syncpass
    # 注意
    # 提供給svnsync的URL必須是指向目標和源版本庫的根目錄,這個工具不支持對版本庫子樹的鏡像處理。
    
  6.  在備份SVN測試數據同步

    $ svnsync synchronize http://192.168.3.10/svn-mirror \
                          --username syncuser --password syncpass
    # 注意
    # svnsync的最初版本(在Subversion 1.4)有一些缺陷—-用來認證的--username和--password命令行參數同時作用於源和目標版本庫。
    # 顯然,我們無法保證同步的用戶認證信息是相同的,如果不一樣,用戶使用非交互模式(--non-interactive選項)來運行svnsync時會遇到這個問題(PS:也就是認證無法通過)。 # 現在有趣的部分開始了,通過一個單獨的子命令,我們可以告訴svnsync將所有鏡像的修訂版本從源版本庫拷貝到目標版本庫。
    # [35]svnsync synchronize子命令會查看目標版本庫特定修訂版本的屬性,並且檢測同步的版本庫是哪一個,以及最新鏡像的修訂版本是0。然后它會查詢源版本庫,檢測其最新的修訂版本。
    # 最后,它會詢問源版本庫服務器來開始重演從修訂版本0到最新修訂版本。svnsync從源版本庫服務器得到返回的結果,然后將其作為新的提交轉發到目標版本庫服務器。 # [35] 要預先警告一下,盡管對於普通讀者只需要幾秒鍾就可以理解下面的輸出,而對於整個鏡像過程花費的時間可能會非常長。
  7.  在來源SVN配置post-commit hook,啟用實時備份

    $ svnsync synchronize --non-interactive http://192.168.3.10/svn-mirror \
                          --username syncuser --password syncpass
    
    # --non-interactive 非交互模式,如果程序需要參數,讓程序自行處理
  8. 異常處理
  • svnsync: E165006: Repository has not been enabled to accept revision propchanges;
    ask the administrator to create a pre-revprop-change hook

     請配置pre-revprop-change hook

     

  • Failed to get lock on destination repos, currently held by 'localhost.localdomain:d1dfeaac-b028-4484-a1ec-ae455ba090e1'

    使用 svnsync synchronize 同步時異常終止。如:機器停電,斷網等。

    $ svn propdel svn:sync-lock --revprop -r HEAD http://192.168.3.10/svn-mirror

     

  • svnsync: The requested report is unknown.

   這個錯誤一般不會遇到,svnsync只適用於1.4+版本。請升級該SVN。

 

好了,svn實時備份就到這兒。如有疑問,請留言。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM