svn備份的方式有三種:
1svnadmin dump
2)svnadmin hotcopy
3)svnsync.
2)svnadmin hotcopy
3)svnsync.
優缺點分析
==============
第一種svnadmin dump是官方推薦的備份方式,優點是比較靈活,可以全量備份也可以增量備份,並提供了版本恢復機制。
缺點是:如果版本比較大,如版本數增長到數萬、數十萬,那么dump的過程將非常慢;備份耗時,恢復更耗時;不利於快速進行災難恢復。
個人建議在版本數比較小的情況下使用這種備份方式。
第二種svnadmin hotcopy原設計目的估計不是用來備份的,只能進行全量拷貝,不能進行增量備份;
優點是:備份過程較快,災難恢復也很快;如果備份機上已經搭建了svn服務,甚至不需要恢復,只需要進行簡單配置即可切換到備份庫上工作。
缺點是:比較耗費硬盤,需要有較大的硬盤支持)。
第三種svnsync實際上是制作2個鏡像庫,當一個壞了的時候,可以迅速切換到另一個。不過,必須svn1.4版本以上才支持這個功能。
優點是:當制作成2個鏡像庫的時候起到雙機實時備份的作用;
==============
第一種svnadmin dump是官方推薦的備份方式,優點是比較靈活,可以全量備份也可以增量備份,並提供了版本恢復機制。
缺點是:如果版本比較大,如版本數增長到數萬、數十萬,那么dump的過程將非常慢;備份耗時,恢復更耗時;不利於快速進行災難恢復。
個人建議在版本數比較小的情況下使用這種備份方式。
第二種svnadmin hotcopy原設計目的估計不是用來備份的,只能進行全量拷貝,不能進行增量備份;
優點是:備份過程較快,災難恢復也很快;如果備份機上已經搭建了svn服務,甚至不需要恢復,只需要進行簡單配置即可切換到備份庫上工作。
缺點是:比較耗費硬盤,需要有較大的硬盤支持)。
第三種svnsync實際上是制作2個鏡像庫,當一個壞了的時候,可以迅速切換到另一個。不過,必須svn1.4版本以上才支持這個功能。
優點是:當制作成2個鏡像庫的時候起到雙機實時備份的作用;
以上不是自己觀點,下面真實記錄我的svn sync實驗過程
兩台機器
server1: 192.168.1.224
server2: 192.168.1.225
都是centos6.5環境
首先在sever1上搭建好了一個svn,然后模擬提交了一些東西
然后在sever2上搭建了一個一模一樣的svn,保持空的
現在的目的是將server1同步備份到server2
在server1上直接運行:
svnsync init svn://192.168.1.225/ svn://192.168.1.224/
即svnsync init 目標svn鏈接 源svn鏈接,執行同步之前的初始化
這一步失敗了,報如下錯誤:
svnsync: Repository has not been enabled to accept revision propchanges;
ask the administrator to create a pre-revprop-change hook
提示需要在hooks下面創建一個pre-revprop-change hook
簡單解釋下,hook類似於操作系統的勾子,svn會在收到一些操作請求的時候執行hooks目錄下的對應的腳本,例如想要commit的時候做一些事情就可以在對應的腳本下面添加你要執行的命令,下一次在commit 的時候就會觸發執行
一開始沒明白,不知道應該在源機器上創建還是在目標機器上創建,其實是在目標機器上創建的
然后在目標機器上copy了一份pre-revprop-change.tmpl成pre-revprop-change
再次執行初始化命令
依然報錯,這次的錯誤不一樣了
svnsync: Revprop change blocked by pre-revprop-change hook (exit code 255) with no output.
大概就是同步的過程中剛剛創建的hook調用沒有成功,然后嘗試給pre-revprop-change添加可執行權限,依然失敗
依然失敗,依然失敗,在stack overflow上看到有人提出的解決方法是把pre-revprop-change改成下面這個樣子:
#!/bin/sh
exit 0
再次初始化,終於成功,提示先讓你輸入用戶名密碼,最后一步的輸出如下:


后來經過驗證,確實需要可執行權限,改了之后還是失敗的原因是hooks執行的結果是失敗的,確實執行了
這一步成功之后,下一步同步就直接成功了:
svnsync sync svn://192.168.1.225/


執行這個命令會把沒有同步的版本都同步過去
然后為了讓server1每次有更新之后都自動同步到server2,可以在server1的commit的hooks最后加上執行一下同步的命令:
svnsync sync svn://192.168.1.225/
這樣就完美實現了實時備份,而且在server1出現問題的時候隨時都可以直接切換到server2喲
最后有一點要注意的是,我嘗試備份到一個不為空的svn,也就是目標svn已經存在要備份的repos的時候,是會失敗的,因此,只能備份到一個空的svn
最后還有一個非常重要的要注意的問題就是,如果在直接在目標在做了修改的話,那么后面就沒有辦法同步了,都會失敗,所以,禁止在備份svn上直接做任何操作,這里的花建議專門寫一個腳本,在post-commit勾子里面調用,通過腳本來同步,然后判斷一下是否同步成功,如果同步失敗了需要及時處理,比如可以給相關人員發郵件通知及時處理,防止同步失敗了導致server1一旦宕機之后突然發現server2早就沒有同步了就晚了。