1.版本庫備份
1.1.svnadmin dump方式備份
此方法借助的是Subversion官網推薦的svnadmin dump備份方式,它的優點是比較靈活,既可以進行全量備份又可以進行增量備份,並提供了版本恢復機制。
缺點是如果版本過大,如版本數增加到數萬、數十萬條時,則dump的過程很慢,備份時耗時,恢復備份庫時更耗時,不利於快速進行災難恢復,此方法建議在版本庫較小的情況下采用。
a) 全量備份:
命令格式為:svnadmin dump 版本庫路徑及名稱 -r 導出的版本號 > 備份版本庫存放路徑及名稱(-r是revision的縮寫,也可以--revision代替)
或 svnadmin dump 版本庫路徑及名稱> 備份版本庫存放路徑及名稱(不添加版本號時默認備份最高版本號)
例如:
1. 對project版本庫的前10個版本進行備份,將備份文件保存到H盤的svn_back/dump文件夾中,進入cmd命令行,輸入以下命令:
svnadmin dump E:\Repository\project -r 10 > H:\svn_backup\dump\project.dump
點擊回車后,如圖所示,已經將project版本庫中的前10個版本進行備份。
2. 對project版本庫的所有版本進行備份,將備份文件保存到H盤的svn_backup文件夾中,
進入cmd命令行,輸入以下命令:
svnadmin dump F:\Repository\project>H:\svn_backup\project.dump
點擊回車后,如下圖所示,已經將project版本庫中的12個版本全部備份。
b)增量備份:
增量備份主要使用svnadmin dump的 --incremental選項來實現,在對版本進行管理時,采用增量備份的方法,只需要對版本庫從上次備份后的版本號開始進行備份即可,節省了對版本庫備份時的時間及存放版本的硬盤資源。
命令格式:
svnadmin dump 版本庫路徑及名稱 -r 上次備份的版本號:到本次要備份到的版本號 --incremental > 導出的版本庫存放的路徑及命名
例如:project版本庫此時的最高版本號為16,分三次進行增量備份,每次備份后的文件名稱分別為project1.dump、project2.dump、project3.dump,將備份文件都保存到H盤的svn_backup/dump文件夾下。
首先對project版本庫的版本號為0至10的版本進行備份,備份文件名稱為project1.dump
進入cmd命令行,輸入如下命令:
svnadmin dump E:\Repository\project -r 0:10 > H:\svn_backup\dump\project1.dump
其次對版本號從11至15的版本進行備份,備份文件名稱為project2.dump
輸入命令:svnadmin dump E:\Repository\project -r 11:15 --incremental > H:\svn_backup\dump\project2.dump
最后對版本號從16至16的版本進行備份,備份文件名稱為project3.dump
輸入命令:svnadmin dump E:\Repository\project -r 16:16 --incremental > H:\svn_backup\dump\project3.dump
請注意:上面三個命令中第2,3個命令多了一個--incremental的參數,這就是采用了增量的方式導出版本庫。
1.2.svnadmin hotcopy方式備份
此方法只能進行全量備份,不能進行增量備份,優點是備份較快,災難恢復也很快,如果備份機上已經搭建了svn服務,甚至不需要恢復,只需要進行簡單配置即可切換到備份機上。缺點是比較耗費硬盤空間,需要較大的硬盤支持。
命令格式為:
svnadmin hotcopy 版本庫路徑及名稱備份版本庫存放路徑及名稱
比如:對project版本庫進行熱備份,將備份文件保存到H盤的svn_backup\hotcopy文件夾中,進入cmd命令行,輸入以下命令:
svnadmin hotcopy E:\Repository\project H:\svn_backup\hotcopy\project_bak
或svnadmin hotcopy E:\Repository\project H:\svn_backup\hotcopy\project_bak --clean-logs
點擊回車后,進入hotcopy文件夾下便可發現已將project庫保存下來。
這個命令會制作一個版本庫的完全“熱”拷貝,包括所有的鈎子、配置文件,當然還有數據庫文件。如果命令后面傳遞--clean-logs選項,svnadmin會執行熱拷貝操作,然后刪除不用的Berkeley DB日志文件,可以在任何時候運行這個命令得到一個版本庫的安全拷貝,不管其它進程是否使用這個版本庫。
1.3. svnsync方式備份
svnsync是Subversion的一個遠程版本庫鏡像工具,它允許把一個版本庫的內容錄入到另一個。在任何鏡像場景中,有兩個版本庫:源版本庫,鏡像(或“sink”)版本庫。源版本庫就是svnsync獲取修訂版本的庫,鏡像版本庫是源版本庫修訂版本的目標,兩個版本庫可以是在本地或遠程,它們只是通過URL跟蹤。
此方法同樣只能進行全量備份,它實際上是制作了兩個鏡像庫,當一個壞了的時候可以迅速切換到另一個,它必須是svn1.4版本以上才支持此功能。優點是當制作成兩個鏡像庫的時候可以起到雙機實時備份的作用。缺點是當作為兩個鏡像庫使用時,無法做到“想完全拋棄今天的修改恢復到昨天的樣子”,而當作為普通備份機制每天備份時,操作又較前兩種方法麻煩。具體使用方法見下面的例子。
例如:采用svnsync方式同步備份兩台機器的SVN,同步的版本庫名稱為project,SVN版本庫在1.4以上
源版本庫目錄為:svn://10.1.1.156/project
同步版本庫目標目錄為:http://10.1.1.224/project
1. 首先在目標目錄中創建一個空的版本庫,如果目標目錄中存在相同的項目,先清除再創建一個新的版本庫
命令為:svnadmin create E:\Repository\project
2. 在目標目錄的project版本庫的hooks目錄下,新建pre-revprop-change.bat
內容只有:exit 0
也可以直接將pre-revprop-change.tmpl更改為pre-revprop-change.bat,然后將其中的內容的最后三行注釋掉,或者清空內容只添加一句exit 0
3. 執行初始化
在目標目錄機器中進入cmd命令行,輸入如下命令:
svnsync init http://10.1.1.224/project svn://10.1.1.156/project
即svnsunc init 目標庫路徑 源庫路徑
注:執行這一步一般會出現問題:svnsync認證失敗,解決方法是將源版本庫中的conf拷貝到目標版本庫的conf中替換。
如果成功則會首先提示輸入目標機器的密碼,此項輸與不輸無關緊要,然后提示輸入登陸版本庫的用戶名和密碼,建議源版本庫和目標版本庫設置相同的用戶名和密碼,輸入正確后會提示Copied properties for revision 0.
4. 執行同步
在目標目錄機器中的cmd命令行,輸入如下命令:
svnsync sync http://10.1.1.224/project
即svnsunc sync 目標庫路徑
點擊回車后會顯示復制的版本號和提交數據等信息。
如果同步時出現“Failed to get lock on destination repos, currently held by 'svn.test.com:0e4e0d98-631d-0410-9a00-9330a90920b3'
...
Failed to get lock on destination repos, currently held by 'svn.test.com:0e4e0d98-631d-0410-9a00-9330a90920b3'
svnsync: Couldn't get lock on destination repos after 10 attempts ”的錯誤:
是因為版本庫屬性被鎖,刪掉屬性即可:
svn propdel svn:sync-lock --revprop -r0 http://10.1.1.224/project
5. 更新同步
1) Windows環境下:
a. 采用全量備份:
首先在源版本庫project的根目錄下添加commit.bat腳本,內容如下:
echo off
set SVN_HOME="C:\Program Files\Subversion"
set SVN_ROOT=E:\Repository
set BACKUP_SVN_ROOT=E:\Repositorybak
set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,10%
if exist %BACKUP_DIRECTORY% goto checkBack
echo 建立備份目錄%BACKUP_DIRECTORY%>>%SVN_ROOT%/backup.log
mkdir %BACKUP_DIRECTORY%
for /r %SVN_ROOT% %%I in (.) do @if exist "%%I\conf\svnserve.conf" %SVN_ROOT%\simpleBackup.bat "%%~fI" %%~nI
goto end
:checkBack
echo 備份目錄%BACKUP_DIRECTORY%已經存在,請清空。
goto end
:end
其次同樣在project版本庫根目錄下添加simpleBackup.bat腳本
@echo 正在備份版本庫%1……
@%SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2
@echo 版本庫%1成功備份到了%BACKUP_DIRECTORY%\%2!
b. 采用增量備份:
首先在源版本庫project下的hooks中添加commit.bat腳本,內容如下:
echo off
set SVN_HOME="C:\Program Files\CollabNet\Subversion Server"
set SVN_ROOT=E:\Repository
set DELTA_BACKUP_SVN_ROOT=E:\Repositorybak\delta
set LOG_FILE=%1\backup.log
echo backup revision %2 >> %LOG_FILE%
for /r %SVN_ROOT% %%I in (.) do if /i %SVN_ROOT%\%%~nI == %1 %SVN_ROOT%\%%~nI\hooks\deltaBackup.bat %%~nI %2
goto end
:end
同樣在hooks中再添加deltaBackup.bat腳本,內容如下
@echo 正在備份版本庫%2......
%SVN_HOME%\svnadmin dump %SVN_ROOT%\%1 --incremental --revision %2 >> %DELTA_BACKUP_SVN_ROOT%\%1.dump
%SVN_HOME%\svnsync sync --non-interactive svn://10.1.1.238/%1 --source-username caocan --source-password cc
@echo 版本庫%2成功備份到了%3!
2) Linux環境下
同樣可以按照Windows環境下的方法進行。
最后需要把post-commit.bat 的權限設置為755權限。如果post-commit腳本出錯,或者無可執行權限,在提交更新時會報錯。
2.備份庫恢復
2.1svnadmin dump方式的備份庫
a) 全量備份方式備份庫的恢復
將備份在H盤的svn_backup文件夾中的project.dump恢復到版本庫中。
進入cmd命令行,輸入以下命令:
svnadmin load F:\Repository\project<H:\svn_backup\project.dump
點擊回車后,如下圖所示,已經將備份的project.dump還原到project版本庫中。
注:導入備份庫到新的SVN庫下時,一定要新建庫!
b) 增量備份方法備份庫的恢復
首先創建一個新的版本庫,名稱為project_dump,將前面以增量備份方式備份的三個文件依次導入此版本庫中。
首先導入project1.dump文件,進入cmd命令行,輸入命令:
svnadmin load E:\Repository\project_dump<H:\svn_backup\dump\project1.dump
點擊回車后命令行窗口如下:
然后再導入project2.dump文件,輸入命令:
svnadmin load E:\Repository\project_dump<H:\svn_backup\dump\project2.dump
最后導入project3.dump文件,輸入命令:
svnadmin load E:\Repository\project_dump<H:\svn_backup\dump\project3.dump
至此已將所有的備份文件都導入新版本庫后則整個版本庫都已恢復,此種方法只能針對備份時采用--incremental方式進行備份的文件進行,否則會提示錯誤:版本庫文件已經存在。
2.2.svnadmin hotcopy方式的備份庫
利用hotcopy方式備份的備份庫是一個功能完全的版本庫,當發生嚴重錯誤時可以作為活動版本庫直接進行替換。
2.3.svnsync方式的備份庫
利用svnsync方式備份的備份庫同樣也是一個完整的版本庫,當源版本庫發生嚴重錯誤時可以利用此備份庫作為活動版本庫進行操作。