本文目录导读:

基础备份脚本(完整备份)
#!/bin/bash
# SVN 完整备份脚本
# 配置参数
SVN_REPO_PATH="/var/svn/repos/myproject"
BACKUP_DIR="/backup/svn"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/svn_backup_$DATE.dump"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行完整备份(svnadmin dump)
echo "开始备份SVN仓库..."
svnadmin dump $SVN_REPO_PATH > $BACKUP_FILE
# 压缩备份文件
gzip $BACKUP_FILE
# 保留最近30天的备份
find $BACKUP_DIR -name "*.dump.gz" -mtime +30 -delete
echo "备份完成: ${BACKUP_FILE}.gz"
增量备份脚本(更节省空间)
#!/bin/bash
# SVN 增量备份脚本
SVN_REPO_PATH="/var/svn/repos/myproject"
BACKUP_DIR="/backup/svn"
DATE=$(date +%Y%m%d_%H%M%S)
LAST_BACKUP_FILE="$BACKUP_DIR/last_revision.txt"
# 获取当前最新版本号
CURRENT_REV=$(svnlook youngest $SVN_REPO_PATH)
# 如果是首次备份或需要完整备份
if [ ! -f "$LAST_BACKUP_FILE" ]; then
echo "首次备份,执行完整备份..."
svnadmin dump $SVN_REPO_PATH > $BACKUP_DIR/full_backup_$DATE.dump
echo $CURRENT_REV > $LAST_BACKUP_FILE
else
LAST_REV=$(cat $LAST_BACKUP_FILE)
if [ $CURRENT_REV -gt $LAST_REV ]; then
echo "从版本 $LAST_REV 增量备份到 $CURRENT_REV"
svnadmin dump $SVN_REPO_PATH --incremental -r $((LAST_REV+1)):$CURRENT_REV > $BACKUP_DIR/inc_${LAST_REV}_to_${CURRENT_REV}_$DATE.dump
echo $CURRENT_REV > $LAST_BACKUP_FILE
else
echo "无新版本,无需备份"
fi
fi
远程备份(将备份传到其他服务器)
#!/bin/bash
# SVN 远程备份脚本
# 本地配置
SVN_REPO_PATH="/var/svn/repos/myproject"
TEMP_BACKUP="/tmp/svn_temp_backup.dump"
# 远程配置
REMOTE_HOST="backup-server.example.com"
REMOTE_USER="backup_user"
REMOTE_PATH="/backup/svn/repos"
# 生成备份
DATE=$(date +%Y%m%d_%H%M%S)
echo "正在创建临时备份..."
svnadmin dump $SVN_REPO_PATH > $TEMP_BACKUP
# 压缩
gzip $TEMP_BACKUP
BACKUP_FILE="${TEMP_BACKUP}.gz"
# 传输到远程服务器
echo "正在传输到远程服务器..."
scp $BACKUP_FILE ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/svn_backup_$DATE.dump.gz
# 清理临时文件
rm -f $BACKUP_FILE
echo "远程备份完成"
配置定时任务(Cron)
添加定时执行备份(以每天凌晨2点为例):
# 编辑crontab crontab -e # 添加以下行 0 2 * * * /path/to/backup_script.sh >> /var/log/svn_backup.log 2>&1
备份验证脚本
#!/bin/bash
# SVN 备份验证脚本
BACKUP_FILE=$1
TEST_REPO="/tmp/svn_restore_test"
if [ -z "$BACKUP_FILE" ]; then
echo "用法: $0 <备份文件路径>"
exit 1
fi
# 解压(如果是.gz文件)
if [[ $BACKUP_FILE == *.gz ]]; then
gunzip -k $BACKUP_FILE
BACKUP_FILE="${BACKUP_FILE%.gz}"
fi
# 创建临时仓库并恢复
rm -rf $TEST_REPO
svnadmin create $TEST_REPO
svnadmin load $TEST_REPO < $BACKUP_FILE
if [ $? -eq 0 ]; then
echo "备份文件验证成功!"
else
echo "备份文件验证失败!"
fi
# 清理
rm -rf $TEST_REPO
注意事项
- 仓库锁定:备份期间,SVN仓库必须没有活动连接,建议在低峰期执行
- 磁盘空间:确保备份目录有足够空间(仓库大小×2)
- 测试恢复:定期在测试环境验证备份文件可用性
- 多份备份:遵循3-2-1备份原则(3份副本、2种介质、1份异地)
需要我帮你针对具体的SVN部署环境(版本、路径、备份频率)定制脚本吗?