SVN迁移

阿里云服务器快到期了,要把公网的SVN迁移到内网里,今天刚弄完,总结下。

SVN命令

lsof -i :3690 查看svn是否启动 
ps aux |grep 'svn' 查找所有svn启动的进程 
kill -9 pid 杀死pid这个查找到的svn进程 
/usr/bin/svnserve --daemon --pid-file=/var/run/svnserve.pid -r /var/data/svn/repos --log-file /var/log/svnserve.log      指定以守护进程形式,pid,log的路径来启动svn
netstat -anp|grep svnserve    查看一下SVN信息

SVN迁移一般是备份当前库到另一服务器进行库恢复。

一般采用三种方式:

  1. svnadmin dump
  2. svnadmin hotcopy
  3. svnsync

SVN服务器几种备份策略
SVN库迁移整理方法总结

本人使用过前两种方法,对于SVN库的迁移,足矣。

svnadmin dump

  • 官方推荐的备份方式
  • 可以全量备份也可以增量备份,并提供了版本恢复机制。
  • 如果版本数过多,dump的过程将非常慢;
  • 备份耗时,恢复更耗时;不利于快速进行灾难恢复。
  • 备份时数据变大,恢复后数据可能会变小(缓存之类不备份)
  • 库下的passwdauthz不会备份,需要手动迁移
  • 恢复时库的svnserve.conf里的password-dbauthz-db会自动更改

版本数少时可以使用,版本数多非常耗时,5.2G的数据,备份时大概需二十分钟;恢复时大概需要八小时,都快哭了π_π

svnadmin hotcopy

  • 原设计目的估计不是用来备份的,只能进行全量拷贝
  • 备份过程较快,灾难恢复也很快
  • 需要硬盘空间支持,备份时数据大小跟库大小差不多
  • 恢复时库的svnserve.conf里的password-dbauthz-db不会自动更改,需要手动更改,避免认证失败

备份还原命令

先关闭所有运行的进程,并确认没有程序在访问存储库(如 httpd、svnserve 或本地用户在直接访问)。

备份

  • svnadmin dump
# 压缩备份
svnadmin dump /path/to/repository | gzip > /path/to/repository-backup.gz.date
# 不压缩备份
svnadmin dump /path/to/repository > /path/to/repository-backup.date
# 增量备份
svnadmin dump /path/to/repository –r sour_version:des_version --incremental >sour-des.date
  • svnadmin hotcopy
# 备份
svnadmin hotcopy /path/to/repository  /path/to/repository-backup.date
# 热备份(没试过)
svnadmin hotcopy /path/to/repository  /path/to/repository-backup.date –clean-logs
# 如果你传递–clean-logs选项,svnadmin会执行热拷贝操作,然后删除不用的Berkeley DB日志文件;在任何时候运行这个命令得到一个版本库的安全拷贝,不管其它进程是否使用这个版本库。

恢复

  • svnadmin dump
# 建立新的svn存储库
svnadmin create /path/to/new_repository
# check
ls -l /path/to/new_repository
# 导入没压缩数据
svnadmin load /path/to/new_repository < /path/to/repository-backup.date
# 导入被压缩数据
zcat /path/to/repository-backup.date | svnadmin load /path/to/new_repository 
  • svnadmin hotcopy
# 恢复
svnadmin hotcopy /path/to/repository-backup.date /path/to/new_repository  
# 直接覆盖
mv /path/to/repository-backup.date /path/to/new_repository  

hotcopy恢复不需要先建立库;网上说也可以直接覆盖,本人没试过

此时再启动内网服务器svn服务,即可。如果启用了iptables,主要要放通端口3690

简单脚本

备份

#!/bin/bash

SOUR_SVN="/data/svn/repos"
DES_SVN="/data/svn-$(date +%F)"
[ ! -d "$DES_SVN" ] && mkdir -p "$DES_SVN"

for i in $(ls "$SOUR_SVN")
do
    # 如果是目录,则是SVN库,备份;否则是验证文件之类的,拷贝
    [ ! -f $i ] && svnadmin dump "$SOUR_SVN"/$i "$DES_SVN"/$i-bak.$(date +%F) || cp "$SOUR_SVN"/$i "$DES_SVN"
done

#!/bin/bash
SOUR_SVN="/data/svn/repos"
DES_SVN="/data/svn-$(date +%F)"
[ ! -d "$DES_SVN" ] && mkdir -p "$DES_SVN"

for i in $(ls "$SOUR_SVN")
do
    # 如果是目录,则是SVN库,备份;否则是验证文件之类的,拷贝
    [ ! -f $i ] && svnadmin hotcopy "$SOUR_SVN"/$i "$DES_SVN"/$i-bak.$(date +%F) || cp "$SOUR_SVN"/$i "$DES_SVN"
done

内网服务器可以连外网,直接传,因数据量大,用scree (●’◡’●)ノ♥
scp root@ip:/data/svn-0317 /home

恢复

#!/bin/bash

SOUR_SVN="/home/svn-0317"
DES_SVN="/var/data/svn/repos"

mkdir -p /var/data/svn/repos

for i in $(ls "$SOUR_SVN")
do
    [ ! -f $i ] && svnadmin create "$DES_SVN"/$i && svnadmin load "$SOUR_SVN"/$i "$DES_SVN"/${i%%-*} || cp "$SOUR_SVN"/$i "$DES_SVN"
done

#!/bin/bash

SOUR_SVN="/home/svn-0317"
DES_SVN="/var/data/svn/repos"

mkdir -p /var/data/svn/repos

for i in $(ls "$SOUR_SVN")
do
    [ ! -f $i ] && svnadmin hotcopy "$SOUR_SVN"/$i "$DES_SVN"/${i%%-*} || cp "$SOUR_SVN"/$i "$DES_SVN"
done

导完之后发现有个库少了30M。。。

然后使用svnadmin hotcopy又备份了一次,发现也是少30M,猜想是缓存之类的数据

svnlook youngest x
# 查看库的最新版本数

比对阿里云的库版本跟内网的库版本,一致,那就不管了,代码完整就可以了ʅ(´◔౪◔)ʃ

    原文作者:无限小BUG
    原文地址: https://www.jianshu.com/p/295b423d50ad
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞