svn增量备份脚本 | Incremental backup script

每天有空我就观察观察svn,昨天写好一份,但是分布写的,也就是如果我们公司用8个库来存储代码的话,我那个脚本就不能用了,或者需要改动。但这个就不需要了,你只需要在数组REPOSITORY内添加你svn内的库就可以了。无论你有几百个(玩笑),都可以~~~~ 我最喜欢的编辑器界面svn incremental backup script for  kinggoo.com
环境要求:
系统:centos 5.6
svn version:1.6.11
是否需要mail服务:是,请安装sendmail、mutt(可选 只要你linux那可以发送邮件就可以)
是否与http服务整合:是

第一次改完脚本,请自己看是否保存:


sh  -x script.sh --debug

脚本内容:





#!/bin/bash 
####  http://kinggoo.com 
####  需要安装sendmail   mutt以便发送邮件通知,当然也可以改下代码,弄成网页访问形式也可以 
####  不要删除SVN_LOG后面设置变量的任何文件,否则备份时会自动全备 
TIME=`date +%Y%m%d` 
YM=`date +%Y%m` 
SVNROOT=/opt/svnroot 
SVNDATA=/svn 
SVN_LOG=${SVNDATA}/log 
TOMAIL=mail@kinggoo.com 
if [ ! -e ${SVNDATA}/${YM} ] || [ ! -d ${SVNDATA}/${YM} ];then 
    mkdir -p ${SVNDATA}/${YM} 
    SVNDATA=${SVNDATA}/${YM} 
else 
    SVNDATA=${SVNDATA}/${YM} 
fi
#针对配置http集成svn服务来做,如果你没有将http添加到服务。脚本内是通过http服务生效后返回显示信息OK来判断是否启动的! 
HTTP=/etc/init.d 
declare -a  REPOSITORY 
REPOSITORY=( Kinggoo Com ) 
ARR=0 
echo "" > ${SVN_LOG}/svn.mail > /dev/null 
while [ "${ARR}" -lt "${#REPOSITORY[@]}" ] 
do    
    if [ ! -e ${SVN_LOG} ] || [ ! -d ${SVN_LOG} ];then    
        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 
    VANCL_BUILD=`cat ${SVN_LOG}/${REPOSITORY[$ARR]}.version` 
    if [ ! -e ${SVN_LOG}/${REPOSITORY[$ARR]}.version ] && [ -z ${VANCL_BUILD} ];then 
      # 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=$? 
        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 
       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 
echo "`cat ${SVN_LOG}/svn.mail`" |mutt -s "${TIME}" ${TOMAIL}

脚本下载:svn增量备份脚本 (注意脚本里面有一行 BUILD=500  请将它删除,或者注释掉,这是我测试时候用的)

优化后脚本

【20111201】

+增加每月备份存储在相同年月目录下!

+对明天svn备份的reversion 记录,以便日后批量恢复导入。日志格式(REPOSITORY:前一版本号:最后版本号),均写在同一文件内

【20111202】

+修正某版本库无变动导致服务http服务无法正常启动

【20111204】

+脚本又出问题,没考虑每次备份后写入到库.version文件的信息处理!已经修改!

【20120802】

+脚本首行缺少“#”,感谢sooyoo的提醒!

- THE END -
版权声明:
转载原创文章请注明,文章出处:http://kinggoo.com
原文地址:http://kinggoo.com/svn-incrementalscript.htm
发表评论?

6 条评论。

  1. !/bin/bash 前面没有“#”吗?

  2. svn增量备份恢复脚本 - KingGoo博客 - pingback on 2012 年 01 月 05 日 在 18:10
  3. svn增量备份脚本的一些思路 - KingGoo博客 - pingback on 2011 年 12 月 09 日 在 11:41
  4. 谢谢分享!

发表评论


Trackbacks and Pingbacks: