Posted on 2010-09-26 11:26
幻海藍(lán)夢 閱讀(1444)
評論(0) 編輯 收藏 所屬分類:
Linux 、
版本管理
subversion作為開發(fā)部門的一個必備工具,其地位已經(jīng)從原來的小弟一躍成為老大的位置(真有取代CVS的可能)。平時我都是很小心的呵護著我公司的這臺服務(wù)器,冷不丁打個噴嚏,我都會顫抖三分。
為了徹底擺脫我的被動局面,趕緊花了些錢買了臺性能不錯的服務(wù)器專門給這位老大弄個替身,號稱雙龍會,即使老大不小心掛掉了,俺也能立馬讓替身上場,代替那位可憐的大哥。
svn服務(wù)器代碼庫是每時每刻都在更新的,所以,最好的備份方式就是同步了,正好svn新版本帶了svnsync的命令,可以實現(xiàn)這個功能。再結(jié)合post-commit的hook腳本,我們就可以在用戶提交代碼的同時,讓服務(wù)器自動更新庫版本到備份服務(wù)器上。
不過,為了預(yù)防萬一,每周來個全備份還是很有必要的,起碼多了一個保障,所以,這里可以用到svnadmin hotcopy 功能。在這,我先就貼上同步的腳本吧。
svnsync腳本我修改了一部分,增加了簡單的檢測功能,檢測版本號是否相同,如果不同則同步,否則直接退出到下一個repository,檢測備份服務(wù)器是否存在這個repository,如沒有就創(chuàng)建。算是一個完善補充吧。
SVN備份總結(jié):
1)svnadmin hotcopy, 優(yōu)點:備份速度很快,屬于完全拷貝源數(shù)據(jù)庫,連配置文件和hook腳本一起都會拷貝過去。缺點:要是每次拷貝可真夠麻煩,庫要是很多,不大適合用此方法備份。
2)svnsync:優(yōu)點:可以和hook腳本結(jié)合,每有更新就可以同步到備份服務(wù)器中,確實是出家旅行,必備方案。缺點:速度真夠慢的,要等死人的......
還有一個svn dump方法,我就不介紹,這個似乎結(jié)合了完全備份和增量備份的優(yōu)點。不過,不大適合做為slave服務(wù)器,我沒用這個方法。
PS:附件為兩個腳本的代碼文件。
#更新時間:2009-09-11 4 PM
#更新內(nèi)容:增加了檢查hook文件pre-revprop-change的代碼
代碼如下:
#我將遠(yuǎn)程備份服務(wù)器通過NFS掛載到/backup/svnsync目錄下
#svn repository目錄在/home/svnroot目錄下
#projectlist.txt文件為repository列表,格式為每個repository一行
#!/bin/sh
###################################
# svn backup log path
# - This is used to log result
###################################
LogFile=/backup/svnsync/svnback.log
DATE=`date +%Y%m%d`
###################################
# mail address for status updates
# - This is used to email you a status report
###################################
MAILADDR=carywu@yahoo.cn
###################################
# HOSTNAME and project list
# - This is also used for reporting
###################################
ProjectLst=/backup/svnsync/projectlist.txt
###################################
# backup directory
# - This is the path to the backup directory
###################################
BackDir=/backup/svnsync/repository
###################################
# svn directory
# - This is the path to the directory you want to archive
###################################
SVNDIR=/home/svnroot/repository
###################################
# svn command path
# - This is the path to the directory you want to archive
###################################
SVNSYNC=/usr/local/bin/svnsync
SVNLOOK=/usr/local/bin/svnlook
SVNADMIN=/usr/local/bin/svnadmin
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
# our actual rsyncing function
do_echo()
{
touch $hookfile
echo "REPOS="\$1"" >> $hookfile
echo "REV="\$2"" >> $hookfile
echo "USER="\$3"" >> $hookfile
echo "PROPNAME="\$4"" >> $hookfile
echo "ACTION="\$5"" >> $hookfile
chmod 755 $hookfile
}
do_accounting()
{
echo " " > $LogFile
echo " " >> $LogFile
echo "###########################" >> $LogFile
echo "$DATE" >> $LogFile
echo "###########################" >> $LogFile
cd $BackDir
}
do_rsync()
{
PROJECTLIST=`cat $ProjectLst`
for project in $PROJECTLIST
do
projectdata=$SVNDIR/$project
destdir=$BackDir/$project
hookfile="$destdir/hooks/pre-revprop-change"
ssrepo=`$SVNLOOK youngest $projectdata`
dtrepo=`$SVNLOOK youngest $destdir`
#check whether svn repository is existed. if not, then use svnadmin create it.
if [ -d $destdir ]
then
echo "#######################" >> $LogFile
echo "$project" >> $LogFile
echo "#######################" >> $LogFile
echo "checking hooks file" >> $LogFile
if [ -f $hookfile ]
then
chmod 755 $hookfile
else
do_echo
fi
echo "OK, seems we have $project repository,now do init or sync!!" >> $LogFile
echo " " >> $LogFile
echo " " >> $LogFile
else
echo "en.... seems we have no $project repository, now will create it and do init and sync!" >> $LogFile
echo " " >> $LogFile
echo " " >> $LogFile
$SVNADMIN create $destdir
oeo_echo
fi
#check svn version, if 0, then init it.
if [ "$dtrepo" -eq "0" ]
then
$SVNSYNC init file:///$destdir file:///$projectdata
$SVNSYNC sync file:///$destdir
echo "sync $project done into $destdir" >> $LogFile
else
if [ "$ssrepo" -eq "$dtrepo" ]
then
echo "sorry, the repository $project is updated, dont need do it" >> $LogFile
else
$SVNSYNC sync file:///$destdir
echo "sync $project done into $destdir" >> $LogFile
fi
fi
done
}
# our post rsync accounting function
do_mail()
{
mail $MAILADDR -s svn-back_log < $LogFile
}
# run our backup and accounting
do_accounting && do_rsync && do_mail
~
原文:http://carywu.blog.51cto.com/13185/199991
#后續(xù):
這個腳本我運行良久,很是好用,可以在服務(wù)器上設(shè)置每分鐘運行一次,因為版本更新在1分鐘內(nèi)是不會有多少的,所以,運行速度還是很快的。
不過,單純讓服務(wù)器每分鐘就去運行下是不是有點累啊?所以,更好的辦法還是在SVN的hook文件夾中添加一個post-commit腳本,很簡單一點,只需要下面一句話:
svnsync sync --non-interactive file:///backup/svnsync/repository/XXXXX
#XXXXX就是你相應(yīng)的庫名。
#如果svnsync不是在標(biāo)準(zhǔn)的bin目錄下,自己需要指定哦。
毛主席告訴我們,實踐出真知。
實踐證明,這樣能讓SVN備份庫每時每刻都保持同樣的版本。就算你的運行服務(wù)器塌掉了,也可以在2分鐘內(nèi)將備份服務(wù)器接替工作。真是居家旅行,必備良藥啊。
#敬請關(guān)注我的后續(xù)文章......
千萬別聽我忽悠,看我上篇文章的時間吧,那已經(jīng)是個遙遠(yuǎn)的傳說了。
本文出自 51CTO.COM技術(shù)博客