使用svnsync實時備份SVN版本庫

2021-06-28 10:49:16 字數 3272 閱讀 5817

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

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

建立備份空版本庫

$ svnadmin create svn-mirror
配置**、備份svn,建立使用者:syncuser

請確認syncuser使用者對備份svn有寫入許可權。對**svn有讀取許可權。且密碼相同。

配置備份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

exit1#

當然某些網路教程說的是你可以直接清空然後寫入exit 0 ,這種方法雖然可以做,但是注意svnbook中的這句話:

# svnsync的通訊議對於源和目標版本庫版本歷史的不一致非常敏感,因此,雖然svnsync無法要求目標版本庫是唯讀的,[34]最好的辦法就是只允許映象程序修改目標版本庫內容。(ps:映象==**svn 目錄==備份svn)

# [34] 實際上,它不是真的完全唯讀,或者svnsync本身有時間將版本庫歷史拷入。

配置備份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

初始化備份svn

$ svnsync initialize  \ \

--username syncuser --password syncpass

copied properties

for revision 0.

#initialize 可以簡寫為 init 所以上面的命令可以寫作如下:

$ svnsync init \ \

--username syncuser --password syncpass#注意

# 提供給svnsync的url必須是指向目標和源版本庫的根目錄,這個工具不支援對版本庫子樹的映象處理。

在備份svn測試資料同步

$ svnsync synchronize 

/svn-mirror \

--username syncuser --password syncpass

#注意

# svnsync的最初版本(在subversion 1.4)有一些缺陷—-用來認證的--username和--password命令列引數同時作用於源和目標版本庫。

# 顯然,我們無法保證同步的使用者認證資訊是相同的,如果不一樣,使用者使用非互動模式(--non-interactive選項)來執行svnsync時會遇到這個問題(ps:也就是認證無法通過)。

# 現在有趣的部分開始了,通過乙個單獨的子命令,我們可以告訴svnsync將所有映象的修訂版本從源版本庫拷貝到目標版本庫。

# [35]svnsync synchronize子命令會檢視目標版本庫特定修訂版本的屬性,並且檢測同步的版本庫是哪乙個,以及最新映象的修訂版本是0。然後它會查詢源版本庫,檢測其最新的修訂版本。

# 最後,它會詢問源版本庫伺服器來開始重演從修訂版本0到最新修訂版本。svnsync從源版本庫伺服器得到返回的結果,然後將其作為新的提交**到目標版本庫伺服器。

# [35] 要預先警告一下,儘管對於普通讀者只需要幾秒鐘就可以理解下面的輸出,而對於整個映象過程花費的時間可能會非常長。

在**svn配置post-commit hook,啟用實時備份

$ svnsync synchronize --non-interactive  \

--username syncuser --password syncpass

#--non-interactive 非互動模式,如果程式需要引數,讓程式自行處理

異常處理

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

**:

SVN增量備份一 svnsync

源庫 8001 svn projects 新建的 庫 要求 8001 svn projects是開發的 源庫,http localhost svn projects是源庫的映象庫,做增量備份。1.建立bat檔案pre revprop change.bat echo changing revision...

SVN增量備份一 svnsync

源庫 8001 svn projects 新建的 庫 要求 8001 svn projects是開發的 源庫,http localhost svn projects是源庫的映象庫,做增量備份。1.建立bat檔案pre revprop change.bat echo changing revision...

rsync notify實時備份

centos7兩台,關閉防火牆和selinux a 備份端 192.168.74.190 服務端 b 備份源 192.168.112.191 客戶端 1 安裝epel yum y install epel release 2 安裝inotify和rsync服務 yum y install inoti...