一、背景
最近局域网中的本地svn服务老挂,图像想到我们的svn竟然没有做容灾备份,细思极恐,大家脑部一下…
所以决定在阿里云的机器上做个实时备份,现记录一下过程,当然为了安全,我会把里面的IP换一下。
二、备份说明:
-
机器:
源机器:192.168.1.110
目标机器:192.168.1.200,这个机器就是我们要做容灾的机器,就是把110的机器上svn自动同步到200这台机器 -
软件
Subversion 要求1.4版本以上,大家注意版本
三、开始部署
(一)备份机上安装与源主机同版本的svn
#使用 svn --version 命令查看版本,这个又一个前提就是,安装好subversion后要配置环境变量
svn --version
- 下载:Subversion 1.44下载地址
- 一直下一步就可以,然后配置环境变量
- 在目标机器(192.168.1.200)上打开cmd查看svn的版本
svn --version
(二)创建svn服务,方便以后重启
sc create svnserve binpath= "C:\Program Files (x86)\Subversion\bin\svnserve.exe --service -r e:\svn" depend= Tcpip start= auto
sc start svnserve
(三)备份机上创建svn备份版本库并配置
(1)创建版本库
svnadmin create E:\svn\dmj2
(2)修改配置并创建备份账户
- 编辑备份机中版本库目录中conf目录下的svnserve.conf文件,E:\svn\dmj2\conf\svnserve.conf
- 在文件末尾加上
anon-access = read
auth-access = write
password-db = passwd
- 创建一个备份用户bak,用于备份
打开conf/passwd,添加bak账户,密码 bakdmjjy1710
(四)源主机上创建备份账户
- 创建的步骤和上面一样,这里就不在重复了,至于说要设置不同的权限也是可以的,比如只给一个读的权限,如果要分别设置的话 就要启用conf/authz的配置了,这里就不展开了
(五)备份机上限制账户提交版本
- 因为是备份机所以只允许专用的备份账户进行提交操作,在备份版本库中的hooks目录下进行文件操作
- 进入svn备份版本库中的hooks目录
- 创建start-commit.bat文件
- 将下面的脚本添加到start-commit文件中
set USER=%2
if "%USER%" == "bak" (
exit 0
)
echo "Only the syncuser user may commit new revisions" >&2
exit 1
注意:bak是上一步创建的备份账户,脚本中一定不要出现中文
否则会报错,svnsync: 不能把字符串从本地编码转换为“UTF-8”编码
(六)备份机上创建钩子函数文件
- 在备份版本库中的hooks目录下创建钩子函数文件:
- 进入svn备份版本库中的hooks目录
- 创建pre-revprop-change.bat文件
- 将下面的脚本添加到pre-revprop-change.bat文件中
set USER=%3
if "%USER%" == "bak" (
exit 0
)
echo "Only the syncuser user may commit new revisions" >&2
exit 1
注意:bak是上一步创建的备份账户,脚本中一定不要出现中文
否则会报错,svnsync: 不能把字符串从本地编码转换为“UTF-8”编码
(七)在备份机器上初始化备份仓库,源机器上执行同样的命令也行
- 在执行初始化命令,命令语法:
svnsync init {备份机上svn的备份库的url} {源主机上需要备份的库的url} --username {备份账户} --password {备份账户密码}
svnsync init svn://192.168.1.200/dmj2 svn://192.168.1.110/dmj2 --username bak --password bakdmjjy1710
(八)备份机器手动时执行第一次备份,源机器上执行同样的命令也行
命令语法:
svnsync sync 目标url --username 备份账号 --password 备份账号的密码
#这里的目标就是svn://192.168.1.200/dmj2 ,账号 bak 密码 bakdmjjy1710
svnsync sync svn://192.168.1.200/dmj2 --username bak --password bakdmjjy1710
(九)实时备份方案
因为数据是从源主机提交同步的,所以需要在源主机上进行配置
到源主机的版本库中的hooks目录下创建post-commit.bat文件并加入以下脚本
svnsync sync --non-interactive svn://192.168.1.200/dmj2 --username bak --password bakdmjjy1710
当源主机192.168.1.110提交之后,svn通过post-commit钩子函数将自动同步到备份机器192.168.1.200上。
四、问题
如果再同步的过程出现如下错误:
...........................
已提交版本 9529。
复制版本 9529 的属性。
已提交版本 9530。
复制版本 9530 的属性。
svnsync: 无法读取连接: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,
连接尝试失败。
- 重复执行同步操作
svnsync sync svn://192.168.1.200/dmj2 --username bak --password bakdmjjy1710
- 报错:
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
svnsync: Couldn't get lock on destination repos after 10 attempts
- 这个问题是同步的时候会锁定仓库,正常情况下,同步完成后会释放掉锁,但是因为网络异常中断,会导致锁没有释放,就报上述错误。
- 解决方法:解锁,执行下面的命令即可,注意这里被锁定的是目标机器,所以解锁目标机器,不要搞错了哦
svn propdel svn:sync-lock --revprop -r 0 svn://192.168.1.200/dmj2
## 执行结果是 : 从仓库版本 %$ld 删除属性“%$s” 说明解锁成功了,再重新执行同步就可以了