作為開發人員,最大的噩夢莫過于自己辛辛苦苦開發的程序由于各種原因而丟失了。所以定期備份資料乃是開發人員的一大美德(我自己重要的資料備份了4份,分別放在不同的地方)。SVN作為代碼和文檔匯聚之地,定期備份的重要性更是不容置疑。
【2.基本思路】
通常我們備份的方式無非有:完全備份和增量備份兩種。完全備份適用于版本庫的大小比較小的情況,對于版本庫比較大或者已經存在版本庫的情況下,則沒有必要也不可能使用完全備份了。這時增量備份就是一個很好的選擇。
除了完全備份和增量備份,我們還有另外一種方式:版本庫同步。這種方法可以在源版本庫和目標版本庫之間做同步(通常是單向的)。一旦源版本庫發生了改變則可以馬上通知目標版本庫做出相同的改變。
注意:版本庫的備份不能簡單地使用copy-paste的方法來拷貝復雜版本庫的db目錄,否則有可能出現數據不完全的情況。
所以我們的備份策略是:
①首次備份采用完全備份,后續備份采用增量備份和版本庫同步
②完全備份在晚上定時進行,增量備份和版本庫同步在用戶提交時進行
注意:這個策略實際上是有較大問題的(包括備份的方式,頻度,時間):通常完全備份會在每周,月進行一次。而增量備份會,版本庫同步會在每天晚上定時執行,而不是在每次用戶提交后執行,以縮短請求響應。但這里因為本著簡單的原則,只是抽取了最簡單的策略
【3.相關命令】
SVN用于備份的命令有以下三個,分別對應于完全備份,增量備份,版本庫同步。
①svnadmin hotcopy
②svnadmin dump [--incremental]
③svnsync init|sync
關于這三個命令的具體用法,請大家自行參考SVN的用戶手冊以獲得更多資訊。
【4.示例操作】
注:本示例代碼均為網上下載,非本人原創。
Example 1:完全備份
fullbackup.bat





























dofullbackup.bat





由于批處理文件中%date命令的輸出格式受平臺的控制(實際上是控制面板中的時區設置)影響,所以對于文件中使用到date函數的地方,讀者要特別注意。需要首先在DOS下確認日期輸出格式,然后根據實際情況進行截取。
將這兩個文件放在repository的同級目錄下,執行之則可以。讀者可以自行修改上面的環境變量設置
Example 2:增量備份
post-commit.bat















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





這個文件里面特別要注意的就是--incremental這個參數,如果你不加上去的話以后再執行load就會提示版本庫已經存在的錯誤了!而--revision則用于指定備份的版本。
將以上兩個文件放置在repository的hooks目錄下即可。
Example 3:版本庫同步
首先創建一個版本庫用于同步(目標版本庫),其次要在源版本庫和目標版本庫之間建立聯系。這是通過svnsync init來達到的。

這個命令執行過程中可能需要增加兩個參數--username和--password用于指明目標版本庫的用戶名和密碼。
其次在目標版本庫的hooks目錄下建立一個空的文件并命名為pre-revprop-change.bat。這一步很重要,否則會出現鑒權失敗的錯誤。最后就是在源版本庫的hooks目錄下建立一個名為post-commit.bat的文件,如下所示:




但用戶在源版本庫執行了相應的修改動作之后,你會發現目標版本庫也出現了同樣的修改!
附件:完整測試目錄及腳本文件
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。