支持完整+差异+压缩的Subversion备份脚本
今天在服务器上写了一个备份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 ""