svn服务器迁移是一个涉及多个环节的技术过程,尤其在Linux环境下操作时,需兼顾数据一致性、服务连续性和系统安全性,以下从迁移前准备、数据迁移、服务部署及验证优化四个维度,详细阐述完整操作流程及注意事项。

迁移前准备:明确需求与环境评估
在启动迁移前,需全面梳理现有SVN服务器的配置、用户权限及项目数据,确保迁移后环境的一致性和可用性。
现有环境调研
- 服务器信息:记录原SVN服务器的操作系统版本(如CentOS 7/Ubuntu 20.04)、SVN版本(如1.8.x/1.14.x)、安装路径(默认为
/var/svn或自定义路径)、仓库数量及各仓库大小。 - 访问方式:确认SVN服务是通过HTTP(Apache+mod_dav_svn)、HTTPS还是SVN协议(svnserve)提供访问,记录端口号(如3690、8080)及虚拟主机配置(若有)。
- 用户与权限:导出用户权限信息,包括用户列表、密码存储方式(明文/加密)、权限分组(如
/project1/目录对dev组可读写,对guest组只读)及认证模块(如LDAP集成)。 - 依赖服务:检查原服务器是否依赖其他服务(如Apache的SSL证书、DNS域名解析、防火墙规则等),确保迁移后能复现相同功能。
新服务器环境准备
- 系统初始化:在新Linux服务器(建议与原服务器系统版本一致或兼容)上安装必要依赖,如
yum install -y subversion httpd openssl(CentOS)或apt install -y subversion apache2 libapache2-mod-svn(Ubuntu)。 - 磁盘规划:根据仓库总大小预留磁盘空间,建议使用独立分区(如
/data/svn),并设置合理的权限(如chown -R apache:apache /data/svn,若使用HTTP协议)。 - 网络配置:确保新服务器IP地址、主机名、防火墙规则(开放SVN端口3690、HTTP端口80/443)及SELinux配置(临时关闭或配置策略)与原服务器一致,避免迁移后网络中断。
迁移方案制定
根据业务需求选择迁移方式:
- 停机迁移:适用于允许短暂服务中断的场景,操作简单,风险较低。
- 在线迁移:通过SVN的 hotcopy 功能或镜像同步实现零停机迁移,适合对服务连续性要求高的业务。
数据迁移:仓库数据与配置的完整迁移
数据迁移是SVN迁移的核心,需确保仓库数据、用户权限及服务配置的一致性。
仓库数据备份与导出
-
使用svnadmin hotcopy(推荐):
在原服务器上执行svnadmin hotcopy /var/svn/project1 /backup/project1_backup,该命令会创建包含所有修订版本、钩子脚本及配置文件的完整副本,且无需锁定仓库,备份完成后,通过scp -r /backup/project1_backup root@新服务器IP:/data/svn/将数据传输至新服务器。
(图片来源网络,侵删) -
使用svnadmin dump/load(增量迁移):
若需过滤历史版本或进行增量迁移,可先通过svnadmin dump /var/svn/project1 > project1.dump生成仓库dump文件,再使用svnadmin load /data/svn/project1 < project1.dump在新服务器导入,对于大仓库,可结合--revision参数指定版本范围,分批处理。
用户权限与配置迁移
- 权限配置:若使用Apache的
htpasswd认证,需导出用户文件:cp /etc/svn-auth-file /backup/,并传输至新服务器对应路径;若使用LDAP认证,需在新服务器上配置相同的LDAP连接参数。 - 钩子脚本:复制原仓库的
hooks目录(如pre-commit、post-commit等)至新服务器仓库,确保权限一致(chmod -R 755 /data/svn/project1/hooks/)。 - 服务配置:若通过HTTP访问,需复制原Apache的SVN配置文件(如
/etc/httpd/conf.d/subversion.conf或/etc/apache2/mods-enabled/dav_svn.conf),修改其中的仓库路径指向新服务器的/data/svn。
数据传输与校验
- 传输工具选择:小文件可使用
scp,大文件推荐rsync(支持增量同步):rsync -avz /backup/ root@新服务器IP:/data/svn/。 - 数据校验:传输完成后,通过
svnlook youngest /data/svn/project1查看最新修订版本号,与原仓库对比;或使用md5sum校验关键文件(如db/current)的哈希值,确保数据完整性。
服务部署与配置:在新服务器启用SVN服务
数据迁移完成后,需在新服务器部署SVN服务,并确保访问方式与原环境一致。
基于svnserve协议的部署
- 创建仓库:若未通过备份直接迁移,需在新服务器创建仓库:
svnadmin create /data/svn/project1。 - 配置svnserve.conf:编辑
/data/svn/project1/conf/svnserve.conf,设置匿名访问权限(anon-access = none)、认证用户权限(auth-access = write)、密码文件路径(password-db = passwd)及权限文件路径(authz-db = authz)。 - 启动服务:执行
svnserve -d -r /data/svn(-d为后台运行,-r指定仓库根目录),检查端口是否监听:netstat -tuln | grep 3690。
基于Apache+HTTP(S)的部署
- 配置Apache模块:确保
mod_dav_svn和mod_authz_svn已启用(CentOS执行yum install mod_dav_svn,Ubuntu执行a2enmod dav_svn)。 - 修改虚拟主机配置:在Apache配置文件中添加以下内容:
<Location /svn> DAV svn SVNPath /data/svn AuthType Basic AuthName "SVN Repository" AuthUserFile /etc/svn-auth-file Require valid-user </Location>
- 启动服务:执行
systemctl restart httpd(CentOS)或systemctl restart apache2(Ubuntu),通过浏览器访问http://新服务器IP/svn测试是否弹出认证窗口。
SSL证书配置(若使用HTTPS)
- 生成自签名证书(测试环境):
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/svn.key -out /etc/pki/tls/certs/svn.crt。 - 修改Apache配置:在
<Location>标签中添加SSl相关配置,并启用443端口:SSLCertificateFile /etc/pki/tls/certs/svn.crt SSLCertificateKeyFile /etc/pki/tls/private/svn.key
迁移后验证与优化:确保服务稳定运行
功能验证
- 连接测试:通过
svn co svn://新服务器IP/project1(svnserve)或svn co http://新服务器IP/svn/project1(HTTP)检出仓库,验证读写权限。 - 钩子脚本测试:提交代码触发钩子(如发送邮件),确认脚本执行正常。
- 权限验证:使用不同用户账号测试目录访问权限,确保
authz配置生效。
性能优化
- 磁盘IO优化:若仓库较大,可调整文件系统(如使用XFS替代EXT4),或启用SVN的
fsfs缓存参数(在/data/svn/project1/db/fsfs.conf中设置cache-full-texts = yes)。 - Apache优化:启用
mod_deflate压缩传输数据,调整KeepAliveTimeout减少连接开销。 - 日志监控:配置SVN和Apache日志轮转(如
logrotate),避免日志文件过大占用磁盘空间。
切换与回滚
- DNS切换:若使用域名访问,修改DNS解析指向新服务器IP,设置TTL值以缩短生效时间。
- 原服务器保留:迁移完成后保留原服务器至少1周,以便出现问题时快速回滚(如将DNS切回原IP)。
相关问答FAQs
Q1:SVN迁移后用户无法提交代码,提示“authorization failed”,如何解决?
A:通常是由于权限配置问题导致,检查以下三点:
- 确认
authz文件中的用户名与htpasswd中的用户名一致(注意区分大小写); - 检查
authz文件中的路径格式是否正确(如[/project1]而非/project1); - 若使用HTTP协议,确保Apache运行用户(如
apache)对authz文件有读取权限(chmod 644 /data/svn/project1/conf/authz)。
Q2:SVN仓库较大(超过50GB),迁移过程缓慢,如何优化?
A:可从以下方面优化迁移效率:

- 使用
rsync替代scp,实现增量同步,减少传输数据量; - 采用
svnadmin dump时添加--native-eol LF参数(若仓库包含Windows/Linux混合换行符),避免格式转换耗时; - 分批次迁移仓库,例如按版本范围导出dump文件:
svnadmin dump /var/svn/project1 --revision 1000:2000 > part1.dump,在新服务器分批导入; - 调整网络MTU值或使用更快的传输链路(如内网高速FTP)。
