svn全量,增量备份脚本

说明:

     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全量,增量备份脚本)