SVN 备份的三种方式

运维技术  

一、优缺点分析

  • 第一种 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