svn增量备份脚本的一些思路

其实,开始时我也不知道增量备份该怎么做,在公司里没时间去翻这方面东西,回到家也比较懒到家也没有多余的时间去研究。直到还有两天要要续交网费,而我不想续交了,不然每天都耗在网络上不做实事实在是在浪费自己的金钱时间生命。所以最后的两天我翻了很多资料,但看网上的看不太明白,做法也不一样。而且多库以后不便于增加,网上如何获取版本号这个我就没搞清楚他们的逻辑。所以我就把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 '-' ` 

image

但这种方法会有些慢,而且也不利于脚本循环操作,当然也同样达到目的。

最后使用的方法是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点开始备份 

下面是描述图

image


出现下面这个判断语句是因为,我感觉每天的备份都在一个文件夹下的话,太多了,所以根据月份来存档不然一年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 -
版权声明:
转载原创文章请注明,文章出处:http://kinggoo.com
原文地址:http://kinggoo.com/svn-incrementallogic.htm
发表评论?

0 条评论。

发表评论