一、优缺点分析

  • 第一种 svnadmin dump是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。
    • 缺点是:如果版本比较大,如版本数增长到数万、数十万,那么dump的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。
    • 个人建议在版本数比较小的情况下使用这种备份方式。
  • 第二种 svnadmin hotcopy原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份;
    • 优点是:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。
    • 缺点是:比较耗费硬盘,需要有较大的硬盘支持(俺的备份机有1TB空间,呵呵)。
  • 第三种svnsync实际上是制作2个镜像库,当一个坏了的时候,可以迅速切换到另一个。不过,必须svn1.4版本以上才支持这个功能。
    • 优点是:当制作成2个镜像库的时候起到双机实时备份的作用;
    • 缺点是:当作为2个镜像库使用时,没办法做到“想完全抛弃今天的修改恢复到昨晚的样子”;而当作为普通备份机制每日备份时,操作又较前2种方法麻烦。
    • 我们由于版本数比较大 采用第二种做全量备份

二、下面具体描述这三种的备份的方法

  • 计划任务: 每周六执行全量备份一次,周日到周5都是增量备份

  • 全量备份之dump [svnfullamountbak.sh]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #!/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]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #!/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]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #!/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