SVN版本庫實時備份整理
因為公司最近SVN伺服器的檔案特別多,資料量很大,有500g,而用於備份的外接磁碟除了故障,因此需要在這段時間對svn伺服器上的資料做備份,所以特地研究了下svn庫的備份,因為平時不怎麼接觸服務端,一般就用svn客戶端TortoisSVN對程式碼checkOut,commit,update簡單的操作。所以整理了份不同伺服器間進行庫備份的文件,並記錄下來,供大家參考,也方便日後複用。
svn備份一般採用三種方式:
1)svnadmin dump
2)svnadmin hotcopy
3)svnsync
優缺點分析
==============
第一種svnadmin dump是官方推薦的備份方式,優點是比較靈活,可以全量備份也可以增量備份,並提供了版本恢復機制。
缺點是:如果版本比較大,如版本數增長到數萬、數十萬,那麼dump的過程將非常慢;備份耗時,恢復更耗時;不利於快速進行災難恢復。
個人建議在版本數比較小的情況下使用這種備份方式。
第二種svnadmin hotcopy原設計目的估計不是用來備份的,只能進行全量拷貝,不能進行增量備份;
優點是:備份過程較快,災難恢復也很快;如果備份機上已經搭建了svn服務,甚至不需要恢復,只需要進行簡單配置即可切換到備份庫上工作。
缺點是:比較耗費硬碟,需要有較大的硬碟支援(俺的備份機有1TB空間,呵呵)。
第三種svnsync實際上是製作2個映象庫,當一個壞了的時候,可以迅速切換到另一個。不過,必須svn1.4版本以上才支援這個功能。
優點是:當製作成2個映象庫的時候起到雙機實時備份的作用;
缺點是:當作為2個映象庫使用時,沒辦法做到“想完全拋棄今天的修改恢復到昨晚的樣子”;而當作為普通備份機制每日備份時,操作又較前2種方法麻煩。
注:上述介紹摘自網路
下面進入正題,筆者今天介紹的是第三種方式。
--------------------------------------------------------------------------------------------------
本文中裝置:
Window筆記本(Lenovo y400) ip:10.16.122.49 庫d:/Repositories/MyRepository01
VMware虛擬機器(Centos6.7) ip:192.168.193.100 庫/repo/svn/svn-mirror
本文做備份採用的SVN Server提供的svnsync命令,這種方式備份其實就是做映象,備份伺服器上安裝SVN Server(SubVersion)即可提供svn服務
雖然文中將的是是window同步至linux,其實反之或者同類型伺服器之間都類似,不同的是指令碼型別不同window指令碼*.bat ,Linux指令碼隨意命名,需要賦予執行許可權
windows需準備工作:
1更改window伺服器上的同步庫配置檔案
進入安裝
SVN Server
時配置的的倉庫目錄
D:\Repositories\MyRepository01\hooks
複製
post-commit.tmpl
檔案
,
重新命名
post-commit.bat
並編輯,
刪除尾部沒有以
#
開始的所有行,並在尾部加入:
svnsync sync --non-interactive http://192.168.193.100/svn-mirror --username admin1 --password 123456
注:引數
--non-interactive
為非互動模式
username
和
password
為能通過
svn
認證的使用者名稱和密碼
192.168.193.100
為
Linux
伺服器的
ip
2開啟登錄檔(win+r àregedit)
應該都是64位的機器吧現在,注意鍵名帶引號
1. for 32-bit system(32位):
[HKEY_LOCAL_MACHINE\SOFTWARE\VisualSVN\VisualSVN Server]
新增 "CreateGnuTLSCompatibleCertificate"=dword:00000001
2. for 64-bit system(64位):
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\VisualSVN\VisualSVN Server] 新增"CreateGnuTLSCompatibleCertificate"=dword:00000001
window上開啟VisualSVN Server Manager
選擇Action(操作)—Properties如下圖:
1,Network選項卡中將Use secure connection(https://)前的複選框去掉勾選,
2,看圖
直至建立self-signed certificate結束。
注
:
如果沒有上述的準備的話在
linux
上執行下面的
svnsync
init file:////usr/backuprepohttp://yao-pc/svn/MyRepository01/
時候,會報:
SSLhandshake failed: SSL
錯誤:
Keyusage
violation in certificate has been detected
的錯,因為
virtual svn
在生成鑑權資料的時候使用了一個外掛,而這個外掛是
OpenSSL
支援的,但
GnuTls
是不支援
Linux
伺服器端操作
1,
建立
Linux
使用者和使用者組
(
重要
)
此使用者是使用
http
協議訪問
svn
庫的認證使用者
# groupadd admin
# useradd admin1 -g admin
# passwd admin1
2,linux伺服器中安裝SubVersion
命令:
# yum install subversion
# yum install mod_dav_svn
#
為了
http
協議
http://ip/repo
訪問
svn
庫
,
預設只能
svn://ip/repo
形式
3,建立版本庫svn-mirror(隨意取名)
# mkdir –p /repo/svn
#
建立存放
svn
庫的根目錄
#
svnadmin create /repo/svn/svn-mirror
4將/repo授權給使用者admin1及其組
# chown –R admin1:admin /repo
5, 配置備份SVN(Linux)的pre-revprop-changehook(鉤子)
# cd /repo/svn/svn-mirror/hooks
# cp pre-revprop-change.tmpl pre-revprop-change
# chmod +x pre-revprop-change
# vim pre-revprop-change
清空並新增如下指令碼
#!/bin/sh
USER="$3"
if [ "$USER" = "admin1" ]; then exit 0; fi
echo "Only the admin1 user may change revision properties" >&2
exit 1
6,配置備份SVN的start-commit hook(可選,但建議配上)
# cp start-commit.tmpl start-commit
# chmod +x start-commit
# vim start-commit
清空並新增如下指令碼
#!/bin/sh
USER="$2"
if [ "$USER" = "admin1" ]; then exit 0; fi
echo "Only the admin1 user may change revision properties" >&2
exit 1
注:建議7,8,9步驟(採用本地檔案路徑file:///)可以先忽略,待至第二部分配置svn的http訪問(採用http模式)結束後再初始化和同步以及啟動
7,初始化備份SVN
# svnsync init file:///
repo/svn/svn-mirror http://10.16.122.49/svn/MyRepository01/
8,同步版本庫
# svnsync sync file:///
repo/svn/svn-mirror
9,啟動svnserver
# svnserve -d -r /
repo/svn #/usr
為
svn
根目錄
即建立版本倉庫
svn-mirror
的目錄
引數
--listen-port 3691
可以指定埠
預設
3690
配置svn的http訪問
1編輯httpd.conf
# vim /etc/httpd/conf/httpd.conf
ServerName localhost:80 #去掉前面的#號
User:admin1 #將使用者名稱更改為admin1為了下文root啟動httpd時候用admin1執行
Group:admin #將組名更改為admin
2編輯subversion.conf配置檔案
# vim /etc/httpd/conf.d/subversion.conf
增加:
<Location /svn-mirror>
DAV svn
SVNPath /repo/svn/svn-mirror#前文建立的版本庫
</Location>
3 新增使用者認證
在上一步中瀏覽器訪問時候任何人都可以匿名訪問,並且擁有寫入,讀取,刪除許可權,這不安全,下面配置使用者寫入時需認證
# mkdir -p /etc/svn
# htpasswd –c /etc/svn/svnusers.conf
admin1
New password:
Re-type new password:
Adding password for user admin1
4 修改上文步驟2中配置的subversion.conf檔案:
<Location /svn-mirror>
DAV svn
SVNPath /repo/svn/svn-mirror
#
對庫的寫許可權需要使用者認證,訪問讀取時不受限制的
<LimitExcept GET PROPFIND OPTIONS REPORT>
#
使用使用者名稱和密碼認證
AuthType Basic
#
認證對話方塊中提示資訊
AuthName "Authorization Realm"
#
認證使用者的檔案路徑
AuthUserFile /etc/svn/svnusers.conf
#
只有認證正確才能訪問
svn
庫
Require valid-user
</LimitExcept>
</Location>
5 開啟httpd服務
# apachectl start
#root
使用者啟動
瀏覽器訪問
http://192.168.193.100/
svn-mirror
注:
svn-mirror
為
subversion.conf
中配置的
<Location /
svn-mirror
>,名稱可以隨意配置
6更改配置/home/admin1/.subversion/servers
# vim /home/admin1/.subversion/servers
#
將前面的
#
號放開,並改為
yes
,為了取消在同步時候需要互動(手動填寫提示資訊)
store-plaintext-passwords = yes
7
初始化
svn
庫
(Linux
上執行
)
# svnsync init http://192.168.193.100/svn-mirror http://10.16.122.49/svn/MyRepository01/--username admin1 –-password 123456
8
同步
svn
庫
# svnsync sync http://192.168.193.100/svn-mirror --usernameadmin1 --password 123456
測試
新建任意檔案提交至MyRepository01
庫中,檢查
svn-mirror
庫中的檔案是否已經更新