前言 {#前言}
SVN数据备份、还原、适用情况、部分异常处理等介绍。备份方式主要有hotcopy
、dump
以及svnsync
三种方式。三类备份方式各有优劣,根据自身情况及需求选择即可。
特别说明,备份还原或者同步后数据原权限分配在特殊情况下可能失效,导致客户端无法正常访问情况。因此还原后最好检查各仓库权限配置是否正常并调整。
hotcopy备份 {#hotcopy备份}
1.1 方法说明 {#1-1-方法说明}
hotcopy备份本质上就是仓库完整拷贝。
- 优点 - 备份过程较快,灾难恢复也快。
- 缺点 - 无法分段备份,因此单次备份时,硬盘消耗相对较大 。
整体上对比来说,hotcopy
的灵活度比不过dump
,即时同步方面比不上过svnsync
;而相对的,他的备份跟恢复方法简单便捷,备份跟恢复的速度也比dump
快。特别是当仓库大,版本数量级达到数万之后,hotcopy
在这方面的优势会远远大于dump
。
1.2 手动备份 {#1-2-手动备份}
如果当前SVN服务器处于未使用状态,直接使用对应系统的复制粘贴功能,最终结果是一样的;若处于使用中,当某些文件处于锁定状态,直接用复制粘贴功能可能出现文件损坏等不可预计问题,此时建议使用官方指令。
备份指令:
svnadmin hotcopy /svn/project /backup/project
或者
svnadmin hotcopy /svn/project /backup/project --clean-logs
注:/svn/project为原库,/backup/project为备份库
1.3 自动备份 {#1-3-自动备份}
自动备份一般是通过编写备份脚本,再通过系统定时任务功能调用该脚本实现。
1.3.1 备份脚本 {#1-3-1-备份脚本}
备份脚本在不同系统下略有差异。如下提供Linuxs与Windows两个系统的脚本示例。
A. Linux系统
a) 执行指令: vi hotcopy.sh
b) 编辑内容:
|---------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13
| #!/bin/sh #仓库根目录 home=/svn/store #备份根目录 backup=/back#备份根目录不存在则创建 if [ ! -d "$backup" ]; then mkdir -p $backup fi#备份仓库名 store1=project#备份仓库目录存在则删除, 做个赋值动作保证删除动作完成后再备份 if [ -d "$backup/$store1" ]; then result=`rm -rf $backup/$store1` fi#执行备份指令 /usr/bin/svnadmin hotcopy $home/$store1 $backup/back_${store1} --clean-logs
|
c) 编辑完成后,按键盘Esc
键后输入 :wq
按回车键保存退出
d) 设置文件操作权限
|-----------|------------------------------|
| 1
| chmod 777 hotcopy.sh
|
B. Windows系统
a) 新建TXT文档
b) 编辑文档内容
|------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12
| echo offrem SVN安装路径 set svn="C:\Program Files (x86)\VisualSVN Server\bin"rem 仓库根目录 set home=E:\SVNrem 备份根目录 set back=D:\backuprem 仓库 set store=Reportrem 备份根目录是否存在 if exist %back% goto check1 md %back%:check1 rem 若备份仓库目录存在,删除备份仓库目录,否则备份无法正常执行if not exist %back%\%store% goto check2rd /s/q %back%\%store%:check2 rem 进入SVN安装路径 cd %svn% rem 执行备份 svnadmin hotcopy %home%\%store% %back%\%store% --clean-logs
|
c) 保存文件为hotcopy.bat
。
记得在"保存类型"中"所有文件(.)",否则最终输出文件会变成
hotcopy.bat.txt
1.3.2 定时任务 {#1-3-2-定时任务}
不同系统定时任务设置方式也有差异,这里主要介绍Linux系统及Windows系统定时任务设置。
A. Linux系统
a) 编辑定时任务
执行指令:vi /etc/crontab
在文档最后添加内容:
0 0 * * * root /home/script/hotcopy.sh
格式为:分 时 日 月 周 用户 脚本路径
b) 查看定时器当前状态
指令:service crond status
若定时器未启动,可执行启动指令:systemctl start crond.service
结果输出类似如下表示已启动:
|---------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6
| Redirecting to /bin/systemctl status crond.service ● crond.service - Command SchedulerLoaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)Active: active (running) since 日 2022-04-10 07:19:22 CST; 1 weeks 5 days agoMain PID: 1263 (crond)CGroup: /system.slice/crond.service└─1263 /usr/sbin/crond -n4月 10 07:19:22 localhost.localdomain systemd[1]: Started Command Scheduler. 4月 10 07:19:22 localhost.localdomain systemd[1]: Starting Command Scheduler... 4月 10 07:19:22 localhost.localdomain crond[1263]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 27% if used.) 4月 10 07:19:22 localhost.localdomain crond[1263]: (CRON) INFO (running with inotify support) 4月 22 17:13:01 localhost.localdomain crond[1263]: (*system*) RELOAD (/etc/crontab)
|
c) 查看执行记录
指令:cat /var/spool/mail/root
说明:指令中最后的root为用户名
B. Windows系统
a) 右键"计算机",在菜单中选择"管理"。
注:"计算机"示例是在Windows程序菜单选择的。实际也可以在文件夹左侧目录或者桌面图标中选择
b) 在"计算机管理"界面中,选择左侧"任务计划程序",后,点击右侧"创建基本任务"。
注:也可以选择右侧第二个"创建任务"进行更复杂的设置,不过一般来说基本任务就可以满足相关操作了。
c) 设置任务名称及描述
d) 设置触发器,即任务周期时间
注:这部分可以根据自身需求执行设置相关内容,示例为每天零时备份
e) 设置操作,选择"启动程序"并设置好需要执行的脚本,进入"下一步"
f) 完成,该部分会展示整个设置结果,检查设置是否正确。点击"完成"完成任务设置
g) 最后可通过左侧"任务计划程序库"查看定时任务设置是否成功
1.4 还原方法 {#1-4-还原方法}
整体仓库还原方法相对简单。根据实际情况,主要有两种还原方法
A. 修改仓库根目录
该方法主要使用在原系统未安装SVN服务器的情况下,直接将仓库根目录指定到备份仓库所在父级目录。
B. 复制备份仓库到仓库根目录
该方法适用于原系统已经安装SVN服务器。
注:其实,若参考根目录下无任何仓库,或者其中仓库数据明显小于备份仓库的情况下,也可以使用A方法,然后将原有的仓库移到新的根目录下。
1.4.1 VisualSVN 还原 {#1-4-1-VisualSVN-还原}
A. 修改仓库根目录
修改仓库根目录有两种方式
a) 在软件安装过程中,到如下步骤时,将Respositories路径设置为备份仓库所在父级目录
b) 软件安装完成后,运行VisualSVN。点击操作"Properties",打开"VisualSVN Server Properties"对话框,并选中"Storage"选项卡,修改其中"Repositores Root"选项,点击"确认"保存即可。
B. 复制备份仓库到仓库根目录
通过A方法中的b) 方法找到仓库根目录,将备份仓库直接复制粘贴到该路径下即可。
1.4.2 SubVersion 还原 {#1-4-2-SubVersion-还原}
A. 修改仓库根目录
a) 停止已运行的svn服务,若未运行过,直接忽略即可
指令:killall svnserve
b) 启动svn服务
指令:svnserve -d -r /backup --listen-port=3690
注:其中/svn/back为参考根目录
B. 复制备份仓库到仓库根目录
指令:cp -rf /backup/project /svn
注: /backup/project为备份仓库, /svn为仓库根目录
1.5 异常提示 {#1-5-异常提示}
A. 异常现象
expected fs format between 1 and 4 found format 6
B. 解决方法
该原因主要由于源库版本较低引起的。新库VisualSVN更新到版本2.7.1以上,Subversion更新到版本1.7.2以上,基本可以解决该问题。
dump备份 {#dump备份}
2.1 方法说明 {#2-1-方法说明}
dump是官方推荐的备份方式,需使用专门的版本还原机制。
- 优点 -- 可全量备份也可增量备份,可根据需要灵活备份或还原指定版本。
- 缺点 -- 相对还原麻烦,特别是版本量多时,还原速度较慢。
整体上对比来说,dump的主要优势就在于灵活。虽然它是官方推荐的备份方式,但是目前从使用方便度来说,个人觉得没有hotcopy跟svnsync好用,除非真有这类灵活备份还原的需求。
都说hotcopy硬盘损耗大,其实dump备份更大。hotcopy备份库也就跟原库一样大,但是用dump备份的后不管是全量还是增量备份,最后都会比原库大很多。
个人SVN仓库27.5G、1.7w+版本,采用全量备份,备份文件45G,采用增量备份,各分段备份文件总和也是45G。备份文件差不多是原库大小的1.6倍。
所以在硬盘资源方面它相对于hotcopy其实是没有优势,而还原备份速度方面的劣势就更不用说了。
可能在本章的自动备份脚本里面会发现,dump增量备份里面,可以根据是否版本有更新再确定是否进行备份操作,而hotcopy跟dump全量备份里都是直接备份的。从这个方面来说dump的增量备份貌似会有优势。但是,实际上,另外两个脚本也可以加同样的版本判断的,只是我没加上去,实际应用中,可根据需要自行添加的,方法参考增量备份的脚本即可。
2.2 手动备份 {#2-2-手动备份}
dump只能通过指令备份。
在linux系统中,可直接通过dump指令执行。但是在Windows中,必须使用DOS指令进入到软件安装路径的bin文件夹下才能进行相关操作。
无论是Linux系统还是Windows系统,备份指令是相同的,具体如下。
- 全量备份:
svnadmin dump /svn/project --revision 100> /back/project100.dump
- 增量备份:
svnadmin dump /svn/project --revision 101:200 --incremental > /back/project101-200.dump
注:
/svn/project为原库,
/back/project100.dump、/back/project101-200.dump为备份文件名,
100、101、200为需要备份的版本
2.3 自动备份 {#2-3-自动备份}
2.3.1 备份脚本 {#2-3-1-备份脚本}
备份脚本在不同系统下略有差异。如下提供Linuxs与Windows两个系统的脚本示例。
A. Linux系统
a) 执行指令: vi dump.sh
编辑内容 b)、c)二选一即可。全量备份脚本选择 b)、增量备份脚本选择 c)
b) 全量备份编辑内容
|------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12
| #!/bin/sh # 仓库根目录 home=/svn/store # 备份根目录 backup=/back# 备份根目录不存在则创建 if [ ! -d "$backup" ]; then mkdir -p $backup fi# 备份仓库名 store1=r1 # 时间字符串变量 d=$(date '+%Y%m%d') # 备份指令 /usr/bin/svnadmin dump $home/$store1 > $backup/${store1}_${d}.dump
|
c) 增量备份编辑内容:
|---------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #!/bin/sh # 仓库根目录 home=/svn/store # 备份根目录 backup=/back# 备份根目录不存在则创建 if [ ! -d "$backup" ];then mkdir -p $backup fi # 备份仓库名 store1=project# 备份根仓库目录不存在则创建 if [ ! -d "$backup/$store1" ];then mkdir -p $backup/$store1 fi# 获取仓库当前最新版本 svnlook youngest $home/$store1 > $backup/tmp_${store1}.TMP upper=$(cat $backup/tmp_${store1}.TMP)# 上次备份版本信息文件不存在最低版本为1,存在读取 if [ ! -f "$backup/last_${store1}.txt" ];then lower=1 else num_lower=$(cat $backup/last_${store1}.txt) lower=`expr $num_lower + 1` fi# 上次备份版本小于等于最高版本时,执行备份操作,并重写上次备份版本信息文件 if [ $num_lower -le $upper ]; thensvnadmin dump $home/$store1 --revision $lower:$upper --incremental > $backup/${store1}_$lower-$upper.dumpecho $upper > $backup/last_${store1}.txtfi# 删除临时版本文件 rm -rf tmp_${store1}.TMP
|
d) 编辑完成后,按键盘Esc
键后输入:wq
按回车键保存退出
e) 设置文件操作权限
指令: chmod 777 dump.sh
B. Windows系统
a) 新建TXT文档
编辑内容 b)、c)二选一即可。全量备份脚本选择 b)、增量备份脚本选择 c)
b) 全量备份编辑内容
|---------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| echo offrem SVN安装路径 set svn="C:\Program Files (x86)\VisualSVN Server\bin"rem 仓库根目录 set home=E:\SVNrem 备份根目录 set back=D:\backuprem 仓库 set store=Reportrem 备份根目录是否存在 if exist %back% goto check1 md %back%:check1 rem 若备份仓库目录不存在,则创建仓库if exist %back%\%store% goto check2 md %back%\%store%:check2 rem 时间字符串变量 set d=% date:~0,4%%date:~5,2%%date:~8,2% rem 进入SVN安装路径 cd %svn% rem 执行备份 svnadmin dump %home%/%store% > %backup%/%store%_%d%.dump
|
c) 增量备份编辑内容
|------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| echo offrem SVN安装路径 set svn="C:\Program Files (x86)\VisualSVN Server\bin"rem 仓库根目录 set home=E:\SVNrem 备份根目录 set back=D:\backuprem 仓库 set store=Reportrem 备份根目录是否存在 if exist %back% goto check1 md %back%:check1 rem 备份仓库目录是否存在 if exist %back%\%store% goto check2 md %back%\%store%:check2 rem 进入SVN安装路径 cd %svn%rem 获取指定仓库当前最新版本 svnlook youngest %home%\%store% > %back%\%store%\TMP.TXT set /p upper=<%back%\%store%\TMP.TXTrem 设置最低版本为0 set lower=0rem 是否存在上次备份版本信息,存在则读取数据更换最低版本值 if not exist %back%\%store%\last.txt goto check3set /p lower=<%back%\%store%\last.txt :check3 rem 最低版本加1 set /a lower=lower+1rem 如果最低版本大于最高版本,不备份 if %lower% gtr %upper% goto endrem 执行备份指令 svnadmin dump %home%\%store% --revision %lower%:%upper% --incremental > %back%\%store%\%lower%-%upper%.dump rem 更新上次备份版本信息 echo %upper% > %back%\%store%\last.txt :end rem 删除临时版本文件 del %back%\%store%\TMP.TXT
|
d) 保存文件为dump.bat。
记得在"保存类型"中"所有文件(.)",否则最终输出文件会变成dump.bat.txt
2.3.2 定时任务 {#2-3-2-定时任务}
定时任务设置方法可参考 1.3.2 定时任务,只需将对应脚本文件替换成2.3.1中的备份脚本即可。
2.4 还原方法 {#2-4-还原方法}
dump备份还原需使用load
指令,全量备份情况下直接还原指定版本即可。增量备份文件需按版本顺序还原备份文件。
指令:svnadmin load /svn/project < /back/project100.dump
/svn/project为服务器仓库路径,/back/project100.dump为待恢复备份文件
2.5 异常提示 {#2-5-异常提示}
A. 异常现象
出现异常提示,主要是在增量备份之时,可能出现如下异常提示:
|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8
| * 已转存版本 7292。 WARNING 0x0000: 版本 2543 引用的数据比最旧的转存版本 (r7001) 还旧。加载这个转存到空的版本库会失败。 WARNING 0x0000: 版本 2543 引用的数据比最旧的转存版本 (r7001) 还旧。加载这个转存到空的版本库会失败。 * 已转存版本 7293。 * 已转存版本 7294。 * 已转存版本 7295。 ...... WARNING 0x0000: 导出的版本范围包含的引用超出导出范围。
|
B. 异常原因
造成该现象原因是因为版本管理过程中出现过版本回滚。以A中示例提示为例:版本7293是版本7292之后回滚到版本2543后修改后提交所得,而这个备份范围是在版本7000-8000,因此做增量比较时,找不到其中的相对源版本2543。
C. 注意事项
如果还原是所有版本逐步还原的情况下,这种提示可忽略,不受影响。但是如果想要删除部分版本的情况下,含这类异常提示的则需要特别处理。
a) 不能删除高于或等于相对源版本的版本
计划删除较老版本,只保留新版本的情况下,基础版本就不能大于相对源版本。以A中示例提示为例,在仅有以上提示情况下,新的基础版本号(全量备份)不能大于2543,否则无法还原。以下为该类操作示例。
|---------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| [root@localhost /]# svnadmin dump /svn/store/test/ --revision 7000 > /back/7000.dump * 已转存版本 7000。 [root@localhost /]# svnadmin dump /svn/store/test/ --revision 7001:8000 --incremental > /back/7001-8000.dump ...... * 已转存版本 7292。 WARNING 0x0000: 版本 2543 引用的数据比最旧的转存版本 (r7001) 还旧。加载这个转存到空的版本库会失败。 WARNING 0x0000: 版本 2543 引用的数据比最旧的转存版本 (r7001) 还旧。加载这个转存到空的版本库会失败。 * 已转存版本 7293。 ...... * 已转存版本 7999。 * 已转存版本 8000。 WARNING 0x0000: 导出的版本范围包含的引用超出导出范围。 [root@localhost /]# svnadmin load /svn/store/test < /back/7000.dump ......* 正在修改路径: Projects/test-Monitor-DBScript/MySQL/SiteMonitor/1.0 Init.sql ...完成。* 正在修改路径: Projects/test-Monitor-DBScript/MySQL/CenterMonitor ...完成。* 正在修改路径: Projects/test-Monitor-DBScript/MySQL/CenterMonitor/1.0 UpdateBusiness.sql ...完成。 ------- 提交新版本 1 (从原始版本 7000 装载) >>> [root@localhost /]# svnadmin load /svn/store/test < /back/7001-8000.dump <<< 开始新的事务,基于原始版本 7094* 正在修改路径: Projects/test-Monitor-SMMonitor/src/com/idbk/test/sm/monitorx/alarmlogic/AlarmCatchingTask.java ...完成。 ------- 提交新版本 95 (从原始版本 7094 装载) >>> <<< 开始新的事务,基于原始版本 7095* 正在修改路径: Projects/test-Monitor-SMMonitor/src/com/idbk/test/sm/monitorx/data/Device8583AlarmData.java ...svnadmin: E160006: 当前版本库不存在相对源版本 -90
|
b) 不能删除中间版本
增量版本必须按顺序逐个恢复,不能跳过中间版本。哪怕如示例中,版本7293的实际是版本是2543调整修改的,版本2544至7292看起来是可以废弃不用的,但是在备份还原中如果跳过这些版本依然无法还原。以下为该类操作示例。
|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3
| [root@localhost /]# svnadmin load /svn/store/test1 < /back/2543.dump ......* 正在修改路径: Projects/Versions/Bin/CS-网点充值/Logs/20150610.log ...完成。* 正在修改路径: Projects/Versions/Bin/CS-网点充值/Logs/20150619.log ...完成。* 正在修改路径: Projects/Versions/Bin/CS-网点充值/Logs/20150722.log ...完成。* 正在修改路径: Projects/Versions/Bin/CS-网点充值/dcrf32.dll ...完成。* 正在修改路径: Projects/Versions/Bin/ChargingStation-Web.war ...完成。* 正在修改路径: Projects/Versions/Bin/ChargingStation-WebMgr.war ...完成。 ------- 提交新版本 1 (从原始版本 2543 装载) >>>
|
|-------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2
| [root@localhost /]# svnadmin load /svn/store/test1 < /back/7293-7300.dump <<< 开始新的事务,基于原始版本 7293* 正在修改路径: Projects/CSProject/Common/Common.csproj ...完成。* 正在修改路径: Projects/CSProject/Common/Financial/DataInitialUserCard.cs ...完成。* 正在修改路径: Projects/CSProject/Common/HttpClient/DataQueryResult.cs ...完成。* 正在修改路径: Projects/CSProject/Common/HttpClient/LoginResult.cs ...完成。* 正在修改路径: Projects/CSProject/Common/HttpClient/VehicleBrands.cs ...svnadmin: E160006: 当前版本库不存在相对源版本 -4748
|
svnsync同步 {#svnsync同步}
3.1 方法说明 {#3-1-方法说明}
svnsync
需SVN1.4版本以上才支持。svnsync
实际上是类似于同时存在两个SVN服务器,只是备份服务器相当于替补的角色。
- 优点 -- 当主服务器损坏时,备份服务器可以直接使用,无缝连接。
- 缺点 -- 无法直接还原到指定版本,初始服务器搭建配置相对前两种方法略复杂。
svnsync
是本人相对喜欢的备份方式。相对于其他两种备份方式而言,svnsync
的初始配置相对要复杂很多,但是也就最开始的部署配置麻烦些,后面就很香了。
最直接的就是省掉了备份还原的动作,不同于hotcopy
跟dump
需要另外借助系统任务管理功能定时进行备份操作,svnsync
在客户端提交版本的同时就同步到备份服务器了,备份及时且方便。在主服务损坏时,另外两类备份方法需要重新搭建服务器或者复原仓库,但是svnsync
备份服务器立即就可以用上。
此外,svnsync
一般是将仓库数据同步到另外一台服务器,相对来说,两边数据同时出现意外的概率相对要小。当然hotcopy
跟dump
也可以通过FTP等方式将数据直接备份到另一台服务器上。但是这样一来,这两种方法的初期配置就不见得比svnsync
简单了。
3.2 备份方法 {#3-2-备份方法}
3.2.1 SVN服务器安装 {#3-2-1-SVN服务器安装}
在备份服务器中安装SVN服务器,并创建与主服务器相对应的仓库。
3.2.2 创建钩子脚本 {#3-2-2-创建钩子脚本}
因为svnsync
备份需要修改备份服务器仓库属性,因此会调用钩子脚本,而仓库原本的钩子脚本是不允许外部修改的,因此需要重新创建。
A 钩子脚本路径
/svn根目录/工程目录/hooks/
B 钩子脚本文件
钩子脚本文件编辑,需进入到工程目录下,创建对应钩子脚本。
最简单的钩子脚本文件如下:
|-----------|-----------------|
| 1
| exit 0;
|
若不想改变原本钩子脚本逻辑,仅需要在同步时允许指定用户(admin)可进行同步操作,可做如下修改。
Linux系统
a) 脚本内容:
|---------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9
| cd /svn/store/project/hooks/ vi pre-revprop-change#!/bin/shEPOS="$1" REV="$2" USER="$3" PROPNAME="$4" ACTION="$5"if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi if [ "$USER" = "admin" ]; then exit 0; fi echo "Changing revision properties other than svn:log is prohibited" >&2 exit 1
|
b) 编辑完后, 按键盘Esc
键后输入 :wq
,回车 保存退出
c) 执行 chmod 777 pre-reprop-change 指令,修改权限。
Windows系统
在钩子脚本文件路径(hooks)下新建一个TXT文档,编辑如下内容后,保存为pre-revprop-change.bat
文件。
编辑内容如下:
|---------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| setlocal set REPOS=%1 set REV=%2 set USER=%3 set PROPNAME=%4 set ACTION=%5 if "%USER%"=="admin" goto OK if not "%ACTION%"=="M" goto refuse if not "%PROPNAME%"=="svn:log" goto refuse goto OK :refuse echo Cann't set %PROPNAME%/%ACTION%, only svn:log is allowed 1>&2 endlocal exit 1 :OK endlocal exit 0
|
3.2.3 初始化 {#3-2-3-初始化}
此时仅初始化,并未同步任何数据
指令:svnsync init svn://192.168.162.111/project file:///svn/project/
注:
- a 备份服务器 - svn://192.168.162.111/project,
- b 主服务器 - file:///svn/project/
- c 本地文件路径前必备为 file:///
初始化过程会要求输出系统登录用户密码,工程仓库用户名/密码。按照提示输入即可
最终输出结果:
|-------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5
| 认证领域: <svn://192.168.162.111:3690> 33b7e9f6-c1de-11ec-8ff6-bd779d2ded64 "root"的密码: ****认证领域: <svn://192.168.162.111:3690> 33b7e9f6-c1de-11ec-8ff6-bd779d2ded64 用户名: admin "admin"的密码: ****** 复制版本 0 的属性。
|
3.2.4 同步 {#3-2-4-同步}
svnsync可自动同步也可手动同步,一般来说初次会手动同步一次,后续会采用自动同步。
A. 手动同步
在Windows系统中可通过以下指令直接同步,但是在Linux同步过程中还会要求输入密码,根据实际要求操作即可。
同步指令: svnsync sync svn://192.168.162.224/project
输出结果:
|---------------------|-----------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6
| 传输文件数据............... 已提交版本 8405。 复制版本 8405 的属性。 传输文件数据... 已提交版本 8406。 复制版本 8406 的属性。
|
B. 自动同步
a) 初始同步之后可在/svn根目录/工程目录/hooks/ 路径下找到 post-commit.tmpl,
b) 复制脚本文件,Linux系统更名为post-commit, Windows系统中更名为pos-commit.bat。
c) 编辑新文件,Linux及Windows均是在文档最后一行加入以下内容:
|-----------|--------------------------------------------------------------------------------------------------------|
| 1
| svnsync sync --non-interactive svn://192.168.162.111/project --username admin --password admin
|
d) 保存编辑内容
Linux系统:
编辑完后,按键盘Esc
键后输入 :wq
保存退出
执行 chmod 777 pre-reprop-change
指令,修改权限。
Windows系统:
直接ctrl+s保存即可。
注:
a svn://192.168.162.111/project为备份服务器仓库路径, 第1/2个admin分别为备份服务器仓库用户名和密码
b 在Linux系统中记得修改post-commit脚本文件权限,否则将无法正常同步。
3.3 异常提示 {#3-3-异常提示}
3.4.1 未创建钩子脚本 {#3-4-1-未创建钩子脚本}
A. 异常提示
svnsync: E165006: 此版本库不允许修改版本属性;请管理员创建 pre-revprop-change 钩子
B. 解决方法
造成该异常原因就是未创建钩子脚本,具体方法草考 3.2.2 创建钩子脚本即可
3.4.2 钩子脚本权限受限 {#3-4-2-钩子脚本权限受限}
A. 异常提示
svnsync: E165001: 版本属性改变 被 pre-revprop-change 钩子阻塞(退出代码 255) 没有输出。
B. 解决方法
造成该异常原因是创建钩子脚本未给予权限,进入钩子脚本所在路径,执行以下指令即可。
指令:chmod 777 pre-reprop-change
3.3.3 连接异常 {#3-3-3-连接异常}
A. 异常提示
无法连接主机"192.168.162.111": 没有到主机的路
B. 原因分析
无法连接主机,有可能IP地址错误、网络异常等。若这几个方面都排出后,最大可能就是防火墙拦截。
C. 解决方法 --- Linux系统
执行如下指令即可:
|-------------|------------------------------------------------------------------------------------------|
| 1 2
| firewall-cmd --zone=public --add-port=3690/tcp --permanent firewall-cmd --reload
|
D. 解决方法 --- Window系统
a) 打开"控制面板",找到"Windows防火墙",选择"高级设置"。
b) 在弹出框中选择"入站规则"中的"新建规则"
c) 在弹框中选择"端口"后点击"下一步",后续步骤根据需要逐一设置到最后点击"完成"。
3.3.4 无法锁定 {#3-3-4-无法锁定}
A. 异常提示
|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3
| Failed to get lock on destination repos, currently held by 'EDGH19000803:22c497b2-67f1-e04c-b347-5e44d71d8f0b' Failed to get lock on destination repos, currently held by 'EDGH19000803:22c497b2-67f1-e04c-b347-5e44d71d8f0b' svnsync: E000022: Couldn't get lock on destination repos after 10 attempts
|
B. 解决方法
出现该异常主要是因为上一次同步过程中,因为某些原因而异常终止,导致下一次同步时无法正常同步。执行以下指令,清除锁即可。
指令:svn propdel svn:sync-lock --revprop --r0 svn://192.168.162.111/project
注: svn://192.168.162.111/project 为备份服务器
参考资料 {#参考资料}
https://www.ngui.cc/zz/1742662.html