支持完整+差异+压缩的Subversion备份脚本

SubversionLinuxShell by 达达 at 2012-09-28

今天在服务器上写了一个备份Subversion用的shell脚本,支持完整备份和差异备份。

完整备份用的是svnadmin hotcopy,跟svnadmin dump比起来,hotcopy备份更快,备份出来的文件体积更小,并且还原也快(只需要复制)

差异备份用的是svnadmin dump --incremental,这样差异备份出来的文件较小,适合在有完整备份的情况下使用。

通过配置cron就可以做到每天凌晨定时完整备份,白天的时候每小时差异备份,完整备份的时候自动删除旧的备份目录,连带里面的差异备份也一起删除,这样可以保证svn的数据得到备份,又不会无止境的增加备份文件。

#!/bin/bash

if [ $# != 3 ]; then
    echo "usage: svn-backup ['full'|'part'] [svn root] [backup dir root]"
    echo "example 1: svn-backup full /opt/svn-repos /opt/svn-backup"
    exit
fi

mode=$1
svn_root=$2
backup_root=$3

for project in `ls -F $svn_root | grep /$ | sed 's/\///g'`
do
    project_dir="$svn_root/$project"
    backup_dir="$backup_root/$project"
    backup_info="$project_dir/backup_info"
    last_version=`svnlook youngest $project_dir`

    if [ ! -f $backup_info ]; then
        echo 0 > $backup_info
    fi
    
    last_backup_version=`cat $backup_info`
    
    if [ $mode != 'full' ] && [ $last_backup_version == $last_version ]; then
        echo "`date +"%F %R:%S"`  '$project' nothing to do"
    else
        if [ $mode == 'full' ] || [ $last_backup_version == '0' ] || [ ! -d $backup_dir ]; then
            echo "`date +"%F %R:%S"`  '$project' full backup"
            rm -rf $backup_dir
            svnadmin hotcopy $project_dir $backup_dir
            last_version=`svnlook youngest $backup_dir`
        else
            echo "`date +"%F %R:%S"`  '$project' version $last_backup_version to $last_version"
            backup_file="$backup_dir/v$last_backup_version-$last_version.bk"
            svnadmin dump --incremental -q -r $last_backup_version:$last_version $project_dir > $backup_file
        fi

        echo $last_version > $backup_info
    fi
done

echo "`date +"%F %R:%S"`  done"
echo ""