VisualSVN服务器的每日同步备份

前言

本文介绍一种通过脚本,在Window环境中创建VisualSVN服务器的仓库镜像,实现数据备份和同步的方法。目标如下:

  1. 搭建一台用于备份的SVN备份服务器
  2. 导入源SVN服务器上的已有仓库和数据到备份服务器
  3. 在备份服务器上定时执行脚本,把源SVN服务器的新增提交同步到备份服务器
  4. 备份服务器拥有与源服务器完全一样的仓库、代码结构、提交历史,当生产服务器数据损坏时,可以通过复制仓库目录的方式恢复源服务器中数据,也可以立即把备份服务器转为生产服务器投入使用。

运行环境

写作本文时的运行环境如下:

  • 操作系统:Windows 2008 R2
  • SVN服务器软件:VisualSVN Server 2.5.26免费版
    备份服务器版本最好与源服务器版本相同。

Step 1. 备份环境准备

1、在源SVN服务器上:
(1) 创建或选择一个账号,要求其权限能够只读访问(不需要写入权限)所有想要备份的仓库,记住账号名和密码,假设为svnsync/power。后面的脚本中需要输入账号信息。

2、在备份服务器上:
(1) 下载并安装VisualSVN Server,且指定SVN仓库的根存储位置。如下图所示,我使用的是D:\repos\
指定SVN仓库根目录
(2) 创建Dump临时工作目录:该目录用于在初次备份时保存已有仓库的Dump文件,所以需要放在一个容量较大的分区上,预先创建此目录即可。我使用的是D:\svndump\
(3) 创建脚本目录:该目录用于存放所有备份相关的脚本文件。我使用的是D:\SVNBackupScript
(4) 在操作系统的Path环境变量中,增加SVN命令行所在路径,如下图所示:
配置环境变量

Step 2. 编写脚本

整套方案由多个脚本文件和配置文件组成,如下所示。其中需要你根据实际情况修改的只有前三个文件:config.batinitRepos.txtsyncRepos.txt

D:\SVNBackupScript
│  config.bat                   --- 配置文件,需要按照实际环境修改
│  initRepos.txt                --- 仓库列表配置文件,登记想要初次导入的仓库名列表
│  syncRepos.txt                --- 仓库列表配置文件,登记已经导入想要同步的仓库名列表
│
└─bin
    │  init.bat                   --- 用于初次导入已有仓库的脚本,对每个仓库列表只需要手动运行一次
    │  sync.bat                   --- 同步脚本,需要放在定时任务中进行
    │
    └─proc                        --- 以下是几个子脚本和配置文件
            createNewRepo.bat            --- 创建并Dump仓库
            pre-revprop-change.txt       --- 备份库的钩子,解决同步时的某些问题
            prepareForExistsRepo.bat     --- 创建新仓库后的初始化工作
            svnDailySync_sub.bat         --- 执行SVN同步命令

文件内容分别如下:

config.bat

请按照你的实际情况修改配置。

@REM Dump文件保存目录
set DUMP_PATH=D:\svndump
@REM 备份库的磁盘路径。因脚本需要,需提供下面两种格式
set REPO_PATH_WIN=D:\repos
set REPO_PATH_SVN=file:///D:/repos
@REM 要备份的SVN服务器URL地址、账号、密码。URL末尾不要带斜杠。
set SVN_URL=https://192.168.3.180:8443/svn
set SVN_USER=svnsync
set SVN_PWD=power
@REM 指定同步日志文件位置
set LOG_FILE=D:\repos\sync.log

initRepos.txt和syncRepos.txt

这两个都是配置文件。把要处理的仓库名写在其中,每行一个。无论要执行下面的初次备份脚本init.bat还是日常同步脚本sysc.bat,都只会处理对应的配置文件中仓库列表。

repo1
repo2

bin\init.bat

该脚本仅在初次导入源SVN中的仓库(即创建备份库)时手动执行一次,脚本会自动完成下面的动作:
(1) 根据initRepos.txt,在本地备份库目录中创建同名仓库
(2) 从源SVN服务器上dump仓库到本地临时dump目录
(3) 导入dump文件到本地同名仓库,并做一些同步的初始化工作
(4) 同步一次

call ..\config.bat
set bin=%cd%
pushd proc
for /f %%i in (%bin%\..\initRepos.txt) do call createNewRepo.bat %%i
popd

bin\sync.bat

该脚本对syncRepos.txt中的仓库执行一次同步。

call ..\config.bat
set d=%date%
set t=%time%
echo ---------------------%d% %t% ---------------------- >> %LOG_FILE%
for /f %%i in (..\syncRepos.txt) do call proc\svnDailySync_sub.bat %%i

bin\proc\createNewRepo.bat

svnrdump dump --username %SVN_USER% --password %SVN_PWD% %SVN_URL%/%1  > %DUMP_PATH%\%1.dmp
svnadmin create %REPO_PATH_WIN%\%1
svnadmin load %REPO_PATH_WIN%\%1 < %DUMP_PATH%\%1.dmp

call prepareForExistsRepo.bat %1

bin\proc\prepareForExistsRepo.bat

copy pre-revprop-change.txt %REPO_PATH_WIN%\%1\hooks\pre-revprop-change.bat
svnsync init %REPO_PATH_SVN%/%1 %SVN_URL%/%1/ --allow-non-empty --source-username %SVN_USER% --source-password %SVN_PWD%
svnsync sync %REPO_PATH_SVN%/%1

bin\proc\pre-revprop-change.txt

#!/bin/sh

exit 0

bin\proc\svnDailySync_sub.bat

@echo 正在同步%1 >> %LOG_FILE% 
svnsync --non-interactive --source-username %SVN_USER% --source-password %SVN_PWD% sync %REPO_PATH_SVN%/%1 >> %LOG_FILE%

Step 3. 导入已有仓库

该步骤导入源SVN中的已有仓库到备份库中,操作步骤如下:

扫描二维码关注公众号,回复: 11842670 查看本文章
  1. 把想要导入的源仓库名,每行一个写入initRepos.txt中,保存
  2. 双击或从命令行中运行 init.bat
  3. 成功后,最好清空initRepos.txt以防未来误操作
  4. D:\svndump\中的dump文件可以删除

执行完成后,在备份服务器的VisualSVN管理控制台中应该就能看到相同的仓库并可以使用,提交历史记录也与源库完全一样。

导入仓库只需要执行一次即可。如果源SVN中添加了新的仓库,则清空initRepos.txt后写入新仓库名,再次执行即可。

Step 4. 同步已导入的仓库

该步骤将会把源SVN仓库中最新的提交记录,同步到已导入的备份仓库,操作步骤如下:

  1. 把需要同步的源仓库名,每行一个写入syncRepos.txt中,保存
  2. 双击或从命令行中运行 sync.bat

执行完成后,备份服务器的VisualSVN中应该能看到与源库完全一样的提交记录。你也可以通过查看日志文件(在config.bat中配置的)了解同步过程。日志文件如下所示:
同步日志文件
同步脚本不会自动同步源服务器上新增的仓库。如果有新增仓库,需要手动导入后,修改syncRepos.txt增加新仓库名。

Step 5. 配置定时同步任务

在Windows的定时任务中,增加一个定时任务,执行sync.bat,如下图所示:
定时任务
在日程安排中指定执行时间即可。

其他说明

  1. 在部署调试都正常后,备份服务器可以无人值守,自动在指定时间同步SVN仓库。
  2. 如果以前曾经手动创建并复制过备份仓库,这种仓库因为缺少一些同步需要的初始化工作是不能直接使用同步脚本进行同步的。这种情况下,请修改init.bat中的命令,把createNewRepo.bat换成prepareForExistsRepo.bat,然后按照"导入已有仓库"的方法执行一次即可。
  3. 当源SVN服务器数据丢失时,先停掉SVN服务,然后拷贝备份库中相应仓库目录到源服务器中即可恢复数据。紧急情况下,也可直接把备份服务器转为正式服务器向开发人员开放。
  4. 目前的备份方案没有备份SVN用户、目录权限。如果打算将来直接把备份服务器当成生产服务器,可以自己设法建立一个定时拷贝任务,把源SVN服务器仓库根目录下的authz、htpasswd文件拷贝到备份服务器相同位置即可。

猜你喜欢

转载自blog.csdn.net/zazzh007/article/details/108661352
今日推荐