美文网首页
svn全量,增量备份脚本

svn全量,增量备份脚本

作者: 随便写点什么就好 | 来源:发表于2019-07-24 09:39 被阅读0次

    说明:

         svn全量和增量循环备份脚本,多库模式和单库模式都使用,只要修改一下svn库的目录即可. 和别人不一样的是,全量和增量都是一个脚本,执行1次全量6次增量存放在一个目录下.

    脚本

    cat /root/svndump.sh

    #!/bin/bash

    # lfh 20190617

    #说明:进行1次全量备份,然后连续进行6次增量备份的方式. 增量起点都是全量备份末点+1,所以恢复的时候只需要全量备份和最新一个增量进行恢复即可

    DATE_LONG=$(date +%Y%m%d-%H%M%S)

    SVN_DIR=/data/svndata        #svn库的目录

    SVN_BAK_DIR=/backup_svn    #备份文件存放的目录,建议是备份放nfs目录

    circle=6                    #连续做6次增量备份,就是备份1次全备,备份6次增量这样来循环,如果没有变化量,本次备份增量会跳过,但是计数还是有效

    function find_increa(){

    #找出是否需要增量备份,增量备份只有在最新的备份目录下的计数文件在1-6的时候进行,其他情况都进行全量备份

    num=`cat $1/.count.id`

    if [ $num -ge 1 ] && [ $num -le $circle ]

    then

        echo "在整理备份计数内,进行增量备份"

        return "0"

    else

        echo "不进行增量备份,进行全量备份"

        return "1"

    fi

    }

    function all_bak(){

    #进行全量备份

    cd $SVN_BAK_DIR

    mkdir -p $DATE_LONG

    cd $DATE_LONG

    for project in `ls $SVN_DIR`

    do

        cd $SVN_DIR

        NUM2=`svnlook youngest $project`

        echo $NUM2 >$SVN_BAK_DIR/$DATE_LONG/.$project.end.id

        #开始备份

        svnadmin dump $project -r 0:$NUM2 --incremental > $SVN_BAK_DIR/$DATE_LONG/$project.dump

        if [ $? -eq 0 ]

        then

            echo "$project 库全量备份成功,备份的revision范围是: 0 - $NUM2  生成的文件是: $project.dump" >>$SVN_BAK_DIR/$DATE_LONG/svnbak_readme.log

            echo "1" >$SVN_BAK_DIR/$DATE_LONG/.count.id

        else

            echo "$project 库全量备份不成功,请检查">>$SVN_BAK_DIR/$DATE_LONG/svnbak_readme.log

        fi

    done

    }

    function incre_bak(){

    #进行增量备份,增量备份函数需要,参数1:目录

    num=`cat $1/.count.id`

    let num=num+1

    echo $num

    echo $num >$1/.count.id    #增量备份计数增加1,不管是否有执行备份成功

    for project in `ls $SVN_DIR`

    do

        NUM1=`cat $1/.$project.end.id`

        cd $SVN_DIR

        NUM2=`svnlook youngest $project`

        if [ $NUM2 -gt $NUM1 ]

        then

            echo "已经有变化,进行备份"

        else

            echo "和上次备份没有变化,不进行增量备份"

            continue

        fi

        let NUM1=NUM1+1

        svnadmin dump $project -r $NUM1:$NUM2 --incremental > $1/$project.dump.incr_$num

        if [ $? -eq 0 ]

        then

            echo "$project 库增量备份成功,备份的revision范围是: $NUM1 - $NUM2  生成的文件是: $project.dump.incr_$num" >>$1/svnbak_readme.log

        else

            echo echo "$project 库增量备份不成功,请检查">>$SVN_BAK_DIR/$DATE_LONG/svnbak_readme.log

        fi

    done

    }

    #找出备份目录下最新的目录

    bak_file=`ls -td $SVN_BAK_DIR/*/`

    if [ "$bak_file" == "" ]

    then

        echo "没有备份生成的目录,进行全量备份"

        all_bak

    else

        echo "数据目录存在"

        new_bak=`echo $bak_file | awk '{ print $1 }'`

        echo $new_bak

        find_increa $new_bak

        if [ $? == 0 ]

        then

          incre_bak $new_bak

        else

          all_bak

        fi

    fi

    定时任务

    #每周进行1次全量备份和6次增量备份,恢复只用全量备份和最后一个增量备份

    10 7 * * *      sh /root/svndump.sh >>/tmp/svndump.log

    # 定期清理过期的备份文件,清理21天之前的备份目录

    40 7 * * 1 find /backup_svn/* -type d -ctime +21 -exec rm -rf {} \;

    执行结果

    备份生成目录

    drwxr-xr-x 2 nobody nobody 4096 Jul 21 07:10 20190715-115206

    drwxr-xr-x 2 nobody nobody 4096 Jul 24 07:10 20190722-071001

    备份文件

    -rw-r--r-- 1 nobody nobody 298 Jul 24 07:10 svnbak_readme.log

    -rw-r--r-- 1 nobody nobody 123268634151 Jul 22 07:50 yy.dump

    -rw-r--r-- 1 nobody nobody    35520418 Jul 23 07:10 yy.dump.incr_2

    -rw-r--r-- 1 nobody nobody    104161851 Jul 24 07:10 yy.dump.incr_3

    备份日志

    cat svnbak_readme.log

    yy 库全量备份成功,备份的revision范围是: 0 - 31659  生成的文件是: yy.dump

    yy 库增量备份成功,备份的revision范围是: 31660 - 31668  生成的文件是: yy.dump.incr_2

    yy 库增量备份成功,备份的revision范围是: 31660 - 31695  生成的文件是: yy.dump.incr_3

    相关文章

      网友评论

          本文标题:svn全量,增量备份脚本

          本文链接:https://www.haomeiwen.com/subject/ncstrctx.html