使用svnsync實時備份SVN版本庫

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

花費了點時間研究了下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.10dom

 

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

     請確認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【可選,但建議配上】post

    複製代碼
    #!/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測試數據同步spa

    複製代碼
    $ 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。

相關文章
相關標籤/搜索