红旗Linux Server 5.0下Subversion的备份策略实现

 

概述

SVN的备份一般有3种方式:svnadmin dump svnadmin hotcopysvnsync本文采用全量备份,即使用svnadmin hotcopy的方式进行备份。考虑到硬盘损坏的可能性及灾难发生后快速恢复的需要,本方案采用hotcopy异机备份的方式,要求增加一台Linux操作系统的备机,同样安装SVN服务。

备份策略的要点概述如下:

1)        备份的策略是一个linux shell脚本,路径:/svn/shell/baksvn.sh

2)        baksvn.shlinux 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)        重新安装主机的操作系统及TelnetFtp服务,并按照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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值