SVN服务器备份


前言

SVN数据备份、还原、适用情况、部分异常处理等介绍。备份方式主要有hotcopy、dump以及svnsync三种方式。三类备份方式各有优劣,根据自身情况及需求选择即可。

此外,特别说明,备份还原或者同步后数据原权限分配在特殊情况下可能失效,导致客户端无法正常访问情况。因此还原后最好检查各仓库权限配置是否正常并调整。权限分配方法可参根据需要参考 SVN服务器安装 - Linux系统 或者 SVN服务器安装 - Windows系统


1 hotcopy备份

1.1 方法说明

hotcopy备份本质上就是仓库完整拷贝。

优点 - 备份过程较快,灾难恢复也快。
缺点 - 无法分段备份,因此单次备份时,硬盘消耗相对较大 。

整体上对比来说,hotcopy的灵活度比不过dump,即时同步方面比不上过svnsync;而相对的,他的备份跟恢复方法简单便捷,备份跟恢复的速度也比dump快。特别是当仓库大,版本数量级达到数万之后,hotcopy在这方面的优势会远远大于dump。

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 备份脚本

备份脚本在不同系统下略有差异。如下提供Linuxs与Windows两个系统的脚本示例。

A. Linux系统

a) 执行指令: vi hotcopy.sh

b) 编辑内容:

#!/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) 设置文件操作权限

指令: chmod 777 hotcopy.sh

B. Windows系统

a) 新建TXT文档

b) 编辑文档内容

echo off

rem SVN安装路径
set svn="C:\Program Files (x86)\VisualSVN Server\bin"

rem 仓库根目录
set home=E:\SVN

rem 备份根目录
set back=D:\backup

rem 仓库
set store=Report

rem 备份根目录是否存在
if exist %back% goto check1
md %back%

:check1
rem 若备份仓库目录存在,删除备份仓库目录,否则备份无法正常执行
 if not exist %back%\%store% goto check2
 rd /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 定时任务

不同系统定时任务设置方式也有差异,这里主要介绍Linux系统及Windows系统定时任务设置。

A. Linux系统

a) 编辑定时任务

执行指令:vi /etc/crontab
在文档最后添加内容:
0 0 * * * root /home/script/hotcopy.sh

格式为:分 时 日 月 周 用户 脚本路径

b) 查看定时器当前状态

指令:service crond status

若定时器未启动,可执行启动指令:systemctl start crond.service

结果输出类似如下表示已启动:

Redirecting to /bin/systemctl status crond.service
● crond.service - Command Scheduler
   Loaded: 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 ago
 Main PID: 1263 (crond)
   CGroup: /system.slice/crond.service
           └─1263 /usr/sbin/crond -n

4月 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 还原方法

整体仓库还原方法相对简单。根据实际情况,主要有两种还原方法

A. 修改仓库根目录

该方法主要使用在原系统未安装SVN服务器的情况下,直接将仓库根目录指定到备份仓库所在父级目录。

B. 复制备份仓库到仓库根目录

该方法适用于原系统已经安装SVN服务器。

注:其实,若参考根目录下无任何仓库,或者其中仓库数据明显小于备份仓库的情况下,也可以使用A方法,然后将原有的仓库移到新的根目录下。

1.4.1 VisualSVN 还原

A. 修改仓库根目录

修改仓库根目录有两种方式

a) 在软件安装过程中,到如下步骤时,将Respositories路径设置为备份仓库所在父级目录
在这里插入图片描述
b) 软件安装完成后,运行VisualSVN。点击操作“Properties”,打开“VisualSVN Server Properties”对话框,并选中“Storage”选项卡,修改其中“Repositores Root”选项,点击“确认”保存即可。
在这里插入图片描述
在这里插入图片描述
B. 复制备份仓库到仓库根目录

通过A方法中的b) 方法找到仓库根目录,将备份仓库直接复制黏贴到该路径下即可。

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 异常提示

A. 异常现象

expected fs format between 1 and 4 found format 6

B. 解决方法

该原因主要由于源库版本较低引起的。新库VisualSVN更新到版本2.7.1以上,Subversion更新到版本1.7.2以上,基本可以解决该问题。


2 dump备份

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 手动备份

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.1 备份脚本

备份脚本在不同系统下略有差异。如下提供Linuxs与Windows两个系统的脚本示例。

A. Linux系统

a) 执行指令: vi dump.sh

编辑内容 b)、c)二选一即可。全量备份脚本选择 b)、增量备份脚本选择 c)

b) 全量备份编辑内容

#!/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) 增量备份编辑内容:

#!/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 ]; then

svnadmin dump $home/$store1 --revision $lower:$upper --incremental > $backup/${store1}_$lower-$upper.dump

echo $upper > $backup/last_${store1}.txt

fi

# 删除临时版本文件
rm -rf tmp_${store1}.TMP

d) 编辑完成后,按键盘Esc键后输入:wq按回车键保存退出

e) 设置文件操作权限

指令: chmod 777 dump.sh

B. Windows系统

a) 新建TXT文档

编辑内容 b)、c)二选一即可。全量备份脚本选择 b)、增量备份脚本选择 c)

b) 全量备份编辑内容

echo off

rem SVN安装路径
set svn="C:\Program Files (x86)\VisualSVN Server\bin"

rem 仓库根目录
set home=E:\SVN

rem 备份根目录
set back=D:\backup

rem 仓库
set store=Report

rem 备份根目录是否存在
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) 增量备份编辑内容

echo off

rem SVN安装路径
set svn="C:\Program Files (x86)\VisualSVN Server\bin"

rem 仓库根目录
set home=E:\SVN

rem 备份根目录
set back=D:\backup

rem 仓库
set store=Report

rem 备份根目录是否存在
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.TXT

rem 设置最低版本为0
set lower=0

rem 是否存在上次备份版本信息,存在则读取数据更换最低版本值
if not exist %back%\%store%\last.txt goto check3

set /p lower=<%back%\%store%\last.txt 

:check3
rem 最低版本加1
set /a lower=lower+1

rem 如果最低版本大于最高版本,不备份
if %lower% gtr %upper% goto end

rem 执行备份指令
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 定时任务

定时任务设置方法可参考 1.3.2 定时任务,只需将对应脚本文件替换成2.3.1中的备份脚本即可。

2.4 还原方法

dump备份还原需使用load指令,全量备份情况下直接还原指定版本即可。增量备份文件需按版本顺序还原备份文件。

指令:svnadmin load /svn/project < /back/project100.dump

/svn/project为服务器仓库路径,/back/project100.dump为待恢复备份文件

2.5 异常提示

A. 异常现象

出现异常提示,主要是在增量备份之时,可能出现如下异常提示:

* 已转存版本 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,否则无法还原。以下为该类操作示例。

[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看起来是可以废弃不用的,但是在备份还原中如果跳过这些版本依然无法还原。以下为该类操作示例。

[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 装载) >>>
 [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

3 svnsync同步

3.1 方法说明

svnsync需SVN1.4版本以上才支持。svnsync实际上是类似于同时存在两个SVN服务器,只是备份服务器相当于替补的角色。

优点 – 当主服务器损坏时,备份服务器可以直接使用,无缝连接。
缺点 – 无法直接还原到指定版本,初始服务器搭建配置相对前两种方法略复杂。

svnsync是本人相对喜欢的备份方式。相对于其他两种备份方式而言,svnsync的初始配置相对要复杂很多,但是也就最开始的部署配置麻烦些,后面就很香了。

最直接的就是省掉了备份还原的动作,不同于hotcopy跟dump需要另外借助系统任务管理功能定时进行备份操作,svnsync在客户端提交版本的同时就同步到备份服务器了,备份及时且方便。在主服务损坏时,另外两类备份方法需要重新搭建服务器或者复原仓库,但是svnsync备份服务器立即就可以用上。

此外,svnsync一般是将仓库数据同步到另外一台服务器,相对来说,两边数据同时出现意外的概率相对要小。当然hotcopy跟dump也可以通过FTP等方式将数据直接备份到另一台服务器上。但是这样一来,这两种方法的初期配置就不见得比svnsync简单了。

3.2 备份方法

3.2.1 SVN服务器安装

在备份服务器中安装SVN服务器,并创建与主服务器相对应的仓库。具体方法参考SVN服务器安装 - Linux系统 或者 SVN服务器安装 - Windows系统

3.2.2 创建钩子脚本

因为svnsync备份需要修改备份服务器仓库属性,因此会调用钩子脚本,而仓库原本的钩子脚本是不允许外部修改的,因此需要重新创建。

A 钩子脚本路径

/svn根目录/工程目录/hooks/

B 钩子脚本文件

钩子脚本文件编辑,需进入到工程目录下,创建对应钩子脚本。

最简单的钩子脚本文件如下:

exit 0;

若不想改变原本钩子脚本逻辑,仅需要在同步时允许指定用户(admin)可进行同步操作,可做如下修改。

Linux系统

a) 脚本内容:

cd /svn/store/project/hooks/
vi pre-revprop-change

#!/bin/sh

EPOS="$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文件。

编辑内容如下:

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 初始化

此时仅初始化,并未同步任何数据

指令:svnsync init svn://192.168.162.111/project file:///svn/project/

注:
a 备份服务器 - svn://192.168.162.111/project,
b 主服务器 - file:///svn/project/
c 本地文件路径前必备为 file:///

初始化过程会要求输出系统登录用户密码,工程仓库用户名/密码。按照提示输入即可

最终输出结果:

认证领域: <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 同步

svnsync可自动同步也可手动同步,一般来说初次会手动同步一次,后续会采用自动同步。

A. 手动同步

在Windows系统中可通过以下指令直接同步,但是在Linux同步过程中还会要求输入密码,根据实际要求操作即可。

同步指令: svnsync sync svn://192.168.162.224/project

输出结果:

传输文件数据...............
已提交版本 8405。
复制版本 8405 的属性。
传输文件数据...
已提交版本 8406。
复制版本 8406 的属性。

B. 自动同步

a) 初始同步之后可在/svn根目录/工程目录/hooks/ 路径下找到 post-commit.tmpl,

b) 复制脚本文件,Linux系统更名为post-commit, Windows系统中更名为pos-commit.bat。

c) 编辑新文件,Linux及Windows均是在文档最后一行加入以下内容:
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.4.1 未创建钩子脚本

A. 异常提示

svnsync: E165006: 此版本库不允许修改版本属性;请管理员创建 pre-revprop-change 钩子

B. 解决方法

造成该异常原因就是未创建钩子脚本,具体方法草考 3.2.2 创建钩子脚本即可

3.4.2 钩子脚本权限受限

A. 异常提示

svnsync: E165001: 版本属性改变 被 pre-revprop-change 钩子阻塞(退出代码 255) 没有输出。

B. 解决方法

造成该异常原因是创建钩子脚本未给予权限,进入钩子脚本所在路径,执行以下指令即可。

指令:chmod 777 pre-reprop-change

3.3.3 连接异常

A. 异常提示

无法连接主机“192.168.162.111”: 没有到主机的路

B. 原因分析

无法连接主机,有可能IP地址错误、网络异常等。若这几个方面都排出后,最大可能就是防火墙拦截。

C. 解决方法 — Linux系统

执行如下指令即可:
firewall-cmd --zone=public --add-port=3690/tcp --permanent
firewall-cmd –reload

D. 解决方法 — Window系统

a) 打开“控制面板”,找到“Windows防火墙”,选择“高级设置”。
在这里插入图片描述
b) 在弹出框中选择“入站规则”中的“新建规则”
在这里插入图片描述
c) 在弹框中选择“端口”后点击“下一步”,后续步骤根据需要逐一设置到最后点击“完成”。下图为整个过程示例。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3.4 无法锁定

A. 异常提示

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 为备份服务器


4 参考资料

https://blog.csdn.net/u011078141/article/details/94718649
https://blog.imdst.com/svn-bei-fen-he-huan-yuan/
https://jingyan.baidu.com/article/fd8044fa7fc3245030137a49.html
https://www.cnblogs.com/hengli123/p/13700923.html
https://wenku.baidu.com/view/89f648fc6c1aff00bed5b9f3f90f76c660374c5a.html

### 回答1: 为了保证Windows服务器上的SVN(版本控制系统)数据的安全性,可以采取以下备份措施: 1. 定期备份SVN仓库:使用SVN服务器自带的备份工具,将SVN仓库中的所有数据进行定期备份。可以选择每日、每周或每月备份一次。备份时,应使用合适的存储介质,如外部硬盘、网络存储设备或云存储服务。 2. 定期备份SVN配置文件:定期备份包括svnserve.conf、passwd和authz等配置文件,以确保服务器恢复时能够还原配置信息。 3. 监控备份过程:在备份过程中,可以使用监控工具来监控备份的完整性和可用性。此外,还可以设置警报,以便及时发现备份故障或异常情况。 4. 多层次备份:采用不同的备份方法和策略,确保备份的多样性和可靠性。例如,可以使用完全备份、增量备份或差异备份等多种备份方式。 5. 测试备份可恢复性:定期测试备份的可恢复性,确保备份文件可以正常还原SVN服务器的数据。测试时,可以使用备份副本进行还原,并进行必要的验证。 6. 加强系统安全性:除了备份外,还应加强Windows服务器的安全性,以防止数据丢失或被恶意攻击。安全措施包括定期更新操作系统和防病毒软件、限制远程访问权限、定期审计系统日志等。 总之,对于Windows服务器上的SVN备份,应采取定期备份、配置文件备份、监控备份过程、多层次备份、测试备份可恢复性以及加强系统安全性等多项措施,来保证SVN数据的安全性和可靠性。 ### 回答2: Windows服务器上使用SVN进行备份的步骤如下: 1. 首先,确保SVN服务已经安装在Windows服务器上,并且已经正确配置和运行。 2. 创建一个用于存储备份文件的目录。可以选择在本地磁盘上创建一个新目录,或者将备份文件存储在网络共享文件夹中。 3. 打开SVN服务配置文件,通常位于服务器安装目录下的conf文件夹中,文件名为svnserve.conf。 4. 在配置文件中找到并取消注释以下两行: # password-db = passwd # authz-db = authz 5. 创建一个用于存储用户认证信息的passwd文件。在conf文件夹中创建一个新的文本文件,命名为passwd,并在文件中添加用户的认证信息。每行的格式为"username = password",如:john = 123456。 6. 创建一个用于设置用户访问权限的authz文件。在conf文件夹中创建一个新的文本文件,命名为authz,并在文件中添加用户的访问权限。每行的格式为"[repository_name:/path/to/folder] username = permission",如:[/] john = rw。 7. 打开命令提示符,切换到SVN服务的bin目录中,执行以下命令来启动SVN服务: svnserve.exe --daemon --root /path/to/repository 其中,/path/to/repository为SVN仓库的路径。 8. 在SVN客户端中输入服务器的IP地址和端口号来连接到SVN服务。 9. 创建一个备份的工作副本,可以使用SVN客户端中的"Checkout"功能来完成。 10. 将工作副本的内容备份到之前创建的备份目录中。可以使用命令行或者文件管理工具来拷贝工作副本的内容到备份目录中。 通过以上步骤,就可以在Windows服务器上使用SVN进行备份备份的文件将保存在指定的目录中,以便在需要时进行恢复或转移到其他位置。记得定期执行备份操作,确保数据的安全性和完整性。 ### 回答3: 在Windows服务器备份SVN的方法有以下几种: 1. 使用SVN的内置备份功能:SVN提供了一个名为“svnadmin”的命令行工具,可以使用它来备份整个SVN仓库。可以使用以下命令备份svnadmin dump <仓库路径> > <备份文件路径> 例如,假设SVN仓库位于C盘的svnrepos文件夹下,要备份到D盘的backup文件中,可以使用以下命令: svnadmin dump C:\svnrepos > D:\backup 2. 使用第三方工具:除了SVN自带的备份工具,还可以使用一些第三方工具来备份SVN仓库,例如BackupEDGE、Bacula等。这些工具可以提供更加全面和灵活的备份选择,可以备份整个仓库、增量备份、定时备份等。 3. 使用版本控制软件:可以使用一些专门针对版本控制的软件来备份SVN仓库。这些软件可以监控SVN仓库的变化,并自动备份相关文件。例如,可以使用Veeam Backup & Replication等工具进行SVN仓库的备份。 无论选择哪种备份方法,都需要确保备份的数据完整性和存储的安全性。最好将备份文件存储在不同的存储介质上,如外部硬盘、网络存储设备等。此外,建议定期测试备份的可用性,以确保在需要时能够恢复数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值