其实,开始时我也不知道增量备份该怎么做,在公司里没时间去翻这方面东西,回到家也比较懒到家也没有多余的时间去研究。直到还有两天要要续交网费,而我不想续交了,不然每天都耗在网络上不做实事实在是在浪费自己的金钱时间生命。所以最后的两天我翻了很多资料,但看网上的看不太明白,做法也不一样。而且多库以后不便于增加,网上如何获取版本号这个我就没搞清楚他们的逻辑。所以我就把svn所有的help看了一边,最初打算使用下面这行代码来获取svn最新版本号:
VANCL_OLD_BUILD=`svn log ${URL}/Vancl| head -2 |awk -F '|' '{print $1}'|grep -v '-' ` && VJIA_OLD_BUILD=`svn log ${URL}/Vjia |head -2|awk -F '|' '{print $1}'|grep -v '-' `
但这种方法会有些慢,而且也不利于脚本循环操作,当然也同样达到目的。
最后使用的方法是svn自己的命令:svnlook youngest 来获取
———-
下面说说《svn服务增量备份脚本,Incremental backup script》里面脚本的一些变量定义和一些描述吧
SVNROOT=代码库的路径(比如你有一代码库test,路径在/opt/下,那你只需些/opt) SVNDATA=svn代码库数据存放路径 REPOSITORY=( A B C ) #这个地方是配置你代码库的,比如你的代码库A,B,C,或只有一个A的写法( A ),格式"REPOSITORY=(空格A空格) ",代码库两边要有空格 TOMAIL=mail@kinggoo.com 此处填写你的邮件地址,备份好后会邮件通知你 最后你要在crond添加一个计划 0 1 * * * /var/spool/cron/svn.sh ##每天1点开始备份
下面是描述图
出现下面这个判断语句是因为,我感觉每天的备份都在一个文件夹下的话,太多了,所以根据月份来存档不然一年300多个,我自己感觉太多了。如果你不需要分开或者,只需要按年分配那修改变量YM
if [ ! -e ${SVNDATA}/${YM} ] || [ ! -d ${SVNDATA}/${YM} ];then mkdir -p ${SVNDATA}/${YM} SVNDATA=${SVNDATA}/${YM} else SVNDATA=${SVNDATA}/${YM} fi ARR=0 #定义变量为0 echo "" > ${SVN_LOG}/svn.mail > /dev/null #清空邮件内容 while [ "${ARR}" -lt "${#REPOSITORY[@]}" ] #小于数组内数据个数,数组个数=数标+1,所以用小于 do if [ ! -e ${SVN_LOG} ] || [ ! -d ${SVN_LOG} ];then #判断存放build reversion等信息的日志文件夹是否存在 mkdir -p ${SVN_LOG} fi if [ ! -e ${SVNDATA}/${REPOSITORY[$ARR]} ] || [ ! -d ${SVNDATA}/${REPOSITORY[$ARR]} ];then #判断存放增量备份的文件夹是否存在 mkdir -p ${SVNDATA}/${REPOSITORY[$ARR]} fi BUILD=`svnlook youngest ${SVNROOT}/${REPOSITORY[$ARR]}` && sleep 2 #取最高的build号 VANCL_BUILD=`cat ${SVN_LOG}/${REPOSITORY[$ARR]}.version` #读取存放build的文件,为后面最第一次备份判断,如果你删除这个文件的话,那备份就会从0开始。当然如果你是误操作,那你只需要在svn.important内找到该库最大的版本号写如到这个文件即可 if [ ! -e ${SVN_LOG}/${REPOSITORY[$ARR]}.version ] && [ -z ${VANCL_BUILD} ];then #判断存放build的文件是否存在,会者内容为空,如果为空,则像文本内输入最新的版本号 #echo "0" > ${SVN_LOG}/${REPOSITORY[$ARR]}.version echo "${BUILD}" > ${SVN_LOG}/${REPOSITORY[$ARR]}.version VANCL_BUILD=0 else #将最新得到的reversion存储起来,并将之前reversion+1 ((VANCL_BUILD=${VANCL_BUILD}+1)) #对上一版本号加一 echo "${BUILD}" > ${SVN_LOG}/${REPOSITORY[$ARR]}.version #将当前最新版本号记录 fi #ago 小于等于 after if [ ${VANCL_BUILD} -le ${BUILD} ];then #判断上一备份版本号是否小于等于最新的,用小于等于是因为之前有对版本号加一 ${HTTP}/httpd stop |grep -i OK && I=$? #如果你的httpd服务不是rpm安装,或者没有OK标记,那请修改这个位置的的判断 sleep 5 if [ "${I}" -eq "0" ];then echo "httpd is stopping" >> ${SVN_LOG}/svn.mail else /usr/bin/pgrep httpd|xargs kill -9 echo "httpd is kill for stopping" >> ${SVN_LOG}/svn.mail fi echo "${REPOSITORY[$ARR]}:${VANCL_BUILD}:${BUILD}" >> ${SVN_LOG}/svn.important #以一定格式记录每次的build reversion,以便更在大范围恢复的时候脚本化 svnadmin dump ${SVNROOT}/${REPOSITORY[$ARR]} -r ${VANCL_BUILD}:${BUILD} --incremental > ${SVNDATA}/${REPOSITORY[$ARR]}/${REPOSITORY[$ARR]}.${VANCL_BUILD}_${BUILD}.dump.${TIME} 2>> ${SVN_LOG}/${REPOSITORY[$ARR]}.log && sleep 30 && ${HTTP}/httpd start |grep -i OK && I=$? && echo "`ls -l ${SVNDATA}/${REPOSITORY[$ARR]}/${REPOSITORY[$ARR]}.${VANCL_BUILD}_${BUILD}.dump.${TIME}`" >> ${SVN_LOG}/svn.mail #备份的地方用了"&&",这是为了确保上一步骤执行完在继续进行,不然你的代码可能就备份不完全了 if [ "${I}" -eq "0" ];then echo "httpd is running" >> ${SVN_LOG}/svn.mail else echo "httpd is failed" >> ${SVN_LOG}/svn.mail ${HTTP}/httpd restart |grep -i OK && I=$? echo "$I" >> ${SVN_LOG}/svn.mail fi else echo "代码库:${REPOSITORY[$ARR]} , 前一版本:${VANCL_BUILD} 大于后一版本:${BUILD} ,没有执行备份操作!" >> ${SVN_LOG}/svn.mail fi ((ARR=$ARR+1)) #累加 unset VANCL_BUILD BUILD BUILD_TEMP done
the end
- THE END -
0 条评论。