概述
SVN的备份一般有3种方式:svnadmin dump 、svnadmin hotcopy、svnsync,本文采用全量备份,即使用svnadmin hotcopy的方式进行备份。考虑到硬盘损坏的可能性及灾难发生后快速恢复的需要,本方案采用hotcopy异机备份的方式,要求增加一台Linux操作系统的备机,同样安装SVN服务。
备份策略的要点概述如下:
1) 备份的策略是一个linux shell脚本,路径:/svn/shell/baksvn.sh
2) baksvn.sh由linux crond调度运行,在每天的凌晨3:10被自动调度;
3) 考虑磁盘空间限制,SVN备机上只保留最近3个日期的备份目录,对于在最近3个日期之前的备份目录,baksvn.sh会在备份之前进行删除操作;
4) 由于周六、周日不上班,SVN提交较少,在只保留最近3个备份记录 的前提下,周六、周日如果备份,将减少已备份目录版本的差异性,不利于备份安全,因此baksvn中对周日、周一不进行SVN备份,只进行邮件通知。
5) SVN备份的目标路径为/mnt/svn119,备份目录命名规则:repos+当前日期,譬如repos20091112。其中/mnt/svn119映射到备机的/svn目录。
6) 备份的日志信息会存放到主机的/svn/shell/logs目录中,对应的日志文件为:当前日期.log,譬如20091112.log。备份结束后,baksvn.sh会将此日志文件中的信息通过Email发送给相关人员。
7) 在加载(mount)备机的/svn目录未成功的情况下,SVN备份将终止,认为备份失败,只进行邮件通知,不再做其它操作。
8) 每次备份结束后,baksvn会获取linux操作系统的一些关键环境信息,一同记录到日志中,通过邮件发送给相关人员。
9) baksvn.sh支持发送邮件的功能。
安装步骤
1) 安装备机的Reg Flag DC Server Linux 5.0操作系统,配置ftp,telnet服务,并设置为自动启动模式。
2) 参见2.2章节,安装备机的SVN服务,并测试通过。
3) 配置主机和备机的Linux NFS(网络文件系统)共享服务,在主机和备份上,分别执行以下命令:
chkconfig --level 35 portmap on
chkconfig --level 35 nfs on
service portmap start
service nfs start
4) 开放备机上的共享目录及权限
vi /etc/exports
增加以下内容:
/svn *(rw,sync)
再执行以下命令,让共享生效:
exportfx -rv
在主机上,看能否查看到备机的共享信息,执行以下命令:
showmount -e 172.168.16.119
应看到如下内容:
5) 加载备机的共享目录
编辑/etc/rc.local,将加载(mount)备机共享目录的命令加入其中,使主机启动的时候,能自动进行加载。
vi /etc/rc.local
在文件末尾增加如下内容:mount -t nfs 172.168.16.119:/svn /mnt/svn119
手工执行以下命令,让共享目录加载生效:
/etc/rc.local
6) 将ftp安装目录下baksvn.sh复制到主机的/svn/shell/目录下,并新建/svn/shell/logs目录
7) 配置主机的sendmail服务
a) 设置sendmail为自启动,执行以下命令:
chkconfig --level 35 sendmail on
b) 手工启动sendmail
service sendmail start
c) 将可访问的smtp服务器地址加入到access中
vi /etc/mail/access
在末尾添加以下内容:
smtp.163.com RELAY
220.181.12.12 RELAY
如下图:
再执行以下命令:
makemap hash /etc/mail/access.db < /etc/mail/access
d) 重新启动sendmail服务
service sendmail restart
8) 配置crond服务,每天自动调度baksvn.sh
a) 设置crond服务为自启动
chkconfig --level 35 crond on
b) 启动crond
service crond start
c) 增加调度任务
执行命令:crontab -u root –e
在文件末尾增加以下内容:10 3 * * * sh /svn/shell/baksvn.sh,保存退出。
执行crontab -l,应看到以下内容:
重新启动crond,执行如下命令:
service crond restart
安装过程结束!
备份恢复步骤
概述
在以下情况下,需要对SVN进行安全恢复:
1) 主机linux 的知识库损坏,版本缺失导致不连续、不完整;
2) 主机SVN服务不正常;
3) 主机磁盘损坏;
4) 主机操作系统故障,无法正常启动;
针对以上故障,可以采取两种恢复方式:
Ø 恢复方法一:重新安装主机的操作系统、SVN服务,然后通过反向svnadmin hotcopy命令,将备机的备份目录恢复到主机上;
Ø 恢复方法二:直接使用备机接替主机的服务,将备机的IP更改为主机,在路由器端更改备机的IP-MAC绑定。待主机修复正常后,再执行方法一操作,最后将备机的IP恢复为原先的IP地址。
恢复方法一步骤
1) 重新安装主机的操作系统及Telnet、Ftp服务,并按照2.2章节,重新安装SVN服务;
2) 按照2.3.2章节,安装备份策略;
3) 将备机上的知识库恢复到主机上
a) 删除主机上的repos目录
rm -rf /svn/repos
b) 将备机的知识库恢复主机
svnadmin hotcopy /mnt/svn119/repos20091112 /svn/repos
备注:根据实际情况,将上述红色字体部分替换为最新的版本备份日期。
c) 将备机的账号等信息恢复到主机
rm -rf /svn/auth
cp -r /mnt/svn119/auth /svn/auth
d) 重新启动apche服务
/usr/local/apache2/bin/apachectl restart
恢复完成!
baksvn.sh
#!/bin/sh
#为保证mount 备机的共享目录成功,执行以下预防操作命令
/etc/rc.local
#服务器上保留3个备份文件,周日和周一不进行备份
status="成功"
week=`date +%w`
week=`echo $week | bc`
if [ $week -eq 0 ] || [ $week -eq 1 ];then
echo "周日和周一凌晨不进行SVN的备份操作,本次不进行备份!">>/svn/shell/logs/$day".log"
status="不备份"
else
#判断mount 119备机是否成功
if [ ! -d /mnt/svn119/shell ];then
echo "mount 119备机服务器上目录没有成功,请检查119备机是否启动!备份失败!">>/svn/shell/logs/$day".log"
status="失败"
else
day=$(date +%Y%m%d --date '0 days ago')
echo "---------------------------------------------------------">>/svn/shell/logs/$day".log"
echo "开始备份,备份开始时间:"`date`>>/svn/shell/logs/$day".log"
count=0;
for((i=0;i<30;i=$[$i+1]));do
#daymsg=$i" days ago"
day2=$(date +%Y%m%d --date $i' days ago')
svndir="/mnt/svn119/repos"$day2
if [ -d $svndir ]; then
echo $svndir"存在!" >>/svn/shell/logs/$day".log"
count=`expr $count + 1`
fi
if [ $count -ge 4 ];then
#备份文件>=4个,删除第4个及以后的备份目录!
if [ -d $svndir ];then
echo "删除先前备份,目录:"$svndir >>/svn/shell/logs/$day".log"
rm -rf $svndir
fi
fi
done
#开始备份,先判断今天日期的目录是否存在,如果已存在,不再做备份
svndir="/mnt/svn119/repos"$day
if [ ! -d $svndir ];then
echo "开始备份svn,目标目录:"$svndir >> /svn/shell/logs/$day".log"
echo "源备份路径文件夹大小:">> /svn/shell/logs/$day".log"
echo `du -sh /svn/repos`>> /svn/shell/logs/$day".log"
/usr/local/subversion/bin/svnadmin hotcopy /svn/repos $svndir >> /svn/shell/logs/$day".log"
echo "备份后,目标备份路径文件夹大小:">> /svn/shell/logs/$day".log"
echo `du -sh $svndir`>> /svn/shell/logs/$day".log"
#备份权限文件夹
rm -rf /mnt/svn119/auth
cp -r /svn/auth /mnt/svn119/auth
echo "备份/svn/auth目录成功!">> /svn/shell/logs/$day".log"
else
echo "备份目录已经存在,不进行备份!目录:"$svndir>>/svn/shell/logs/$day".log"
fi
fi
fi
#echo $svndir
echo "备份结束,备份结束时间:"`date`>>/svn/shell/logs/$day".log"
echo "---------------------------------------------------------">>/svn/shell/logs/$day".log"
echo ""
echo "*********************************************************">>/svn/shell/logs/$day".log"
echo "以下是svn服务器运行信息:">>/svn/shell/logs/$day".log"
echo "120服务器磁盘空间使用情况:">>/svn/shell/logs/$day".log"
echo `df -ah /`>>/svn/shell/logs/$day".log"
echo "CPU使用情况:">>/svn/shell/logs/$day".log"
echo `sar 1`>>/svn/shell/logs/$day".log"
echo "内存使用情况:">>/svn/shell/logs/$day".log"
echo `free`>>/svn/shell/logs/$day".log"
echo "*********************************************************">>/svn/shell/logs/$day".log"
#开始发送邮件
cat /svn/shell/logs/$day".log" |mail -s "svn自动备份通知("$status"!)"$day ***@163.com