说明:
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