1. 程式人生 > >SVN版本庫實時備份整理

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為非互動模式

     usernamepassword為能通過svn認證的使用者名稱和密碼

     192.168.193.100Linux伺服器的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:///)可以先忽略,待至第二部分配置svnhttp訪問(採用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   #/usrsvn根目錄即建立版本倉庫svn-mirror 的目錄
引數--listen-port 3691 可以指定埠預設3690  

配置svn的http訪問

1編輯httpd.conf

# vim /etc/httpd/conf/httpd.conf

ServerName localhost:80   #去掉前面的#

Useradmin1               #將使用者名稱更改為admin1為了下文root啟動httpd時候用admin1執行

Groupadmin               #將組名更改為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-mirrorsubversion.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庫中的檔案是否已經更新