有一次SVN服务器机器坏了,整个研发部门都无法工作了,压力就全在我一个人身上了。好在很快恢复了,但未雨绸缪,以后不能在遇到这种事情了,SVN这么重要的服务器,必须双向备份,快速切换。
镜像服务器:192.168.11.94
原始服务器: 192.168.11.194
镜像服务器操作:
——————————————————————————————————————————————————————————
在镜像服务器创建目标仓库:
svnadmin create /space/repos/Atest
修改pre-revprop-change文件(cp pre-revprop-change.tmpl pre-revprop-change)
#pre-revprop-change
#!/bin/sh
USER="$3"
if [ "$USER" = "admin" ]; then exit 0; fi
echo "Only the svnsync user can change revprops" >&2
exit 1
让pre-revprop-change有可执行权限 chmod 755 pre-revprop-change
初始化
svnsync init --username admin --paasword admin123 svn://192.168.11.94/Atest svn://192.168.11.194/Atest
同步数据
svnsync sync --username admin --password admin521 svn://192.168.12.94/Atest
如果指向中途发送中断,执行下面命令,重新sync
svn propdel svn:sync-lock --revprop -r 0
原始服务器操作:
——————————————————————————————————————————————————————————————
修改仓库下post-commit 文件,熟悉python,直接python实现了
#!/usr/bin/python
#coding=utf-8
import os
import commands
import sys
import logging
def init_log(log_level,logpath):
logger = logging.getLogger()
'''
from logging.handlers import RotatingFileHandler
ro_hdlr=RotatingFileHandler(logpath, maxBytes=0,backupCount=5)
logger.addHandler(ro_hdlr)
ro_hdlr.doRollover()
'''
hdlr = logging.FileHandler(logpath)
formatter = logging.Formatter('%(asctime)s [%(levelname)-8s %(module)s:%(lineno)d] %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(log_level)
return logger
log=init_log(0,'/space/repos/allconfig/log/sync.log')
repos=os.path.basename(sys.argv[1])
log.info("*"*20+repos)
output=commands.getoutput('/usr/local/subversion/bin/svnsync sync --non-interactive --username admin --password admin123 svn://192.168.11.94/'+repos)
log.info('sync log :'+output)
赋予post-commit 可执行权限。这样以后这个项目有人提交新的代码后,就可以同步到镜像服务器了。一旦原始服务器坏了,可以使用relocate 切换到镜像服务器继续工作,但切换过程中,会提示UUID不对,SVN 1.5以上版本可以修改镜像服务器的UUID
svnadmin setuuid /var/svn/repos-new 2109a8dd-854f-0410-ad31-d604008985ab
SVN 1.4版本没有这个功能,那只能通过工具批量修改entries文件了。