一、优缺点分析
第一种 svnadmin dump是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。
- 缺点是:如果版本比较大,如版本数增长到数万、数十万,那么dump的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。
- 个人建议在版本数比较小的情况下使用这种备份方式。
第二种 svnadmin hotcopy原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份;
- 优点是:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。
- 缺点是:比较耗费硬盘,需要有较大的硬盘支持(俺的备份机有1TB空间,呵呵)。
第三种svnsync实际上是制作2个镜像库,当一个坏了的时候,可以迅速切换到另一个。不过,必须svn1.4版本以上才支持这个功能。
- 优点是:当制作成2个镜像库的时候起到双机实时备份的作用;
- 缺点是:当作为2个镜像库使用时,没办法做到“想完全抛弃今天的修改恢复到昨晚的样子”;而当作为普通备份机制每日备份时,操作又较前2种方法麻烦。
- 我们由于版本数比较大 采用第二种做全量备份
二、下面具体描述这三种的备份的方法
计划任务: 每周六执行全量备份一次,周日到周5都是增量备份
全量备份之dump [svnfullamountbak.sh]
#!/bin/sh
##Subversion decritory and file
SVN_HOME=/usr/local/subversion/bin/
SVN_ADMIN=$SVN_HOME/svnadmin
SVN_LOOK=$SVN_HOME/svnlook
SVN_REPOROOT=/data/svnroot/repository
#backup file path
date=$(date '+%Y-%m-%d')
RAR_STORE=/data/svnbackup/full/$date
if [ ! -d "$RAR_STORE" ];then
mkdir -p $RAR_STORE
fi
cd $SVN_REPOROOT
#Projectname 指库名
for name in $(ls|grep Projectname)
do
$SVN_ADMIN dump $SVN_REPOROOT/$name > $RAR_STORE/full.$name.bak
done
- 全量备份之hotcopy [svnhotcopybak.sh]
#!/bin/sh
##Subversion decritory and file
SVN_HOME=/usr/local/subversion/bin/
SVN_ADMIN=$SVN_HOME/svnadmin
SVN_LOOK=$SVN_HOME/svnlook
SVN_REPOROOT=/data/svnroot/repository
#backup file path
date=$(date '+%Y-%m-%d')
RAR_STORE=/data/svnbackup/hotcopy/$date
if [ ! -d "$RAR_STORE" ];then
mkdir -p $RAR_STORE
fi
cd $SVN_REPOROOT
#Projectname 指库名
for name in $(ls|grep Projectname)
do
$SVN_ADMIN hotcopy $SVN_REPOROOT/$name $RAR_STORE/$name
done
- 增量备份 [svnincrementalbak.sh]
#!/bin/sh
##Subversion decritory and file
SVN_HOME=/usr/local/subversion/bin/
SVN_ADMIN=$SVN_HOME/svnadmin
SVN_LOOK=$SVN_HOME/svnlook
SVN_REPOROOT=/data/svnroot/repository
#backup file path
date=$(date '+%Y-%m-%d')
RAR_STORE=/data/svnbackup/incremental/$date
if [ ! -d "$RAR_STORE" ];then
mkdir -p $RAR_STORE
fi
#log file path
Log_PATH=/data/svnbackup/log
if [ ! -d "$Log_PATH" ];then
mkdir -p $Log_PATH
fi
#read repo list
cd $SVN_REPOROOT
#Projectname 指库名
for name in $(ls|grep Projectname)
do
if [ ! -d "$RAR_STORE/$name" ];then
mkdir $RAR_STORE/$name
fi
cd $RAR_STORE/$name
if [ ! -d "$Log_PATH/$name" ];then
mkdir $Log_PATH/$name
fi
echo ******Starting backup from $date****** >> $Log_PATH/$name/$name.log
echo ******svn repository $name startting to backup****** >> $Log_PATH/$name/$name.log
$SVN_LOOK youngest $SVN_REPOROOT/$name > $Log_PATH/A.TMP
UPPER=`head -1 $Log_PATH/A.TMP`
NUM_LOWER=`head -1 $Log_PATH/$name/last_revision.txt`
let LOWER="$NUM_LOWER+1"
$SVN_ADMIN dump $SVN_REPOROOT/$name -r $LOWER:$UPPER --incremental > $RAR_STORE/$name/$LOWER-$UPPER.dump
rm -f $Log_PATH/A.TMP
echo $UPPER > $Log_PATH/$name/last_revision.txt
echo ******This time we bakcup from $LOWER to $UPPER****** >> $Log_PATH/$name/$name.log
echo ******Back up ended****** >> $Log_PATH/$name/$name.log
done