今天在服务器上写了一个备份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 ""
原标签已从 2013-07-27 存档快照 恢复。本文按原站快照恢复排版,并接回已核实的本地图片。查看恢复说明