Posted on 2010-09-26 11:26
幻海蓝梦 阅读(1442)
评论(0) 编辑 收藏 所属分类:
Linux 、
版本管理
subversion作为开发部门的一个必备工具,其地位已经从原来的小弟一跃成为老大的位置(真有取代CVS的可能)。平时我都是很小心的呵护着我公司的这台服务器,冷不丁打个喷嚏,我都会颤抖三分。
为了彻底摆脱我的被动局面,赶紧花了些钱买了台性能不错的服务器专门给这位老大弄个替身,号称双龙会,即使老大不小心挂掉了,俺也能立马让替身上场,代替那位可怜的大哥。
svn服务器代码库是每时每刻都在更新的,所以,最好的备份方式就是同步了,正好svn新版本带了svnsync的命令,可以实现这个功能。再结合post-commit的hook脚本,我们就可以在用户提交代码的同时,让服务器自动更新库版本到备份服务器上。
不过,为了预防万一,每周来个全备份还是很有必要的,起码多了一个保障,所以,这里可以用到svnadmin hotcopy 功能。在这,我先就贴上同步的脚本吧。
svnsync脚本我修改了一部分,增加了简单的检测功能,检测版本号是否相同,如果不同则同步,否则直接退出到下一个repository,检测备份服务器是否存在这个repository,如没有就创建。算是一个完善补充吧。
SVN备份总结:
1)svnadmin hotcopy, 优点:备份速度很快,属于完全拷贝源数据库,连配置文件和hook脚本一起都会拷贝过去。缺点:要是每次拷贝可真够麻烦,库要是很多,不大适合用此方法备份。
2)svnsync:优点:可以和hook脚本结合,每有更新就可以同步到备份服务器中,确实是出家旅行,必备方案。缺点:速度真够慢的,要等死人的......
还有一个svn dump方法,我就不介绍,这个似乎结合了完全备份和增量备份的优点。不过,不大适合做为slave服务器,我没用这个方法。
PS:附件为两个脚本的代码文件。
#更新时间:2009-09-11 4 PM
#更新内容:增加了检查hook文件pre-revprop-change的代码
代码如下:
#我将远程备份服务器通过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
#后续:
这个脚本我运行良久,很是好用,可以在服务器上设置每分钟运行一次,因为版本更新在1分钟内是不会有多少的,所以,运行速度还是很快的。
不过,单纯让服务器每分钟就去运行下是不是有点累啊?所以,更好的办法还是在SVN的hook文件夹中添加一个post-commit脚本,很简单一点,只需要下面一句话:
svnsync sync --non-interactive file:///backup/svnsync/repository/XXXXX
#XXXXX就是你相应的库名。
#如果svnsync不是在标准的bin目录下,自己需要指定哦。
毛主席告诉我们,实践出真知。
实践证明,这样能让SVN备份库每时每刻都保持同样的版本。就算你的运行服务器塌掉了,也可以在2分钟内将备份服务器接替工作。真是居家旅行,必备良药啊。
#敬请关注我的后续文章......
千万别听我忽悠,看我上篇文章的时间吧,那已经是个遥远的传说了。
本文出自 51CTO.COM技术博客