阿里云服务器快到期了,要把公网的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迁移一般是备份当前库到另一服务器进行库恢复。
一般采用三种方式:
- svnadmin dump
- svnadmin hotcopy
- svnsync
本人使用过前两种方法,对于SVN库的迁移,足矣。
svnadmin dump
- 官方推荐的备份方式
- 可以全量备份也可以增量备份,并提供了版本恢复机制。
- 如果版本数过多,dump的过程将非常慢;
- 备份耗时,恢复更耗时;不利于快速进行灾难恢复。
- 备份时数据变大,恢复后数据可能会变小(缓存之类不备份)
- 库下的
passwd
和authz
不会备份,需要手动迁移 - 恢复时库的
svnserve.conf
里的password-db
和authz-db
会自动更改
版本数少时可以使用,版本数多非常耗时,5.2G的数据,备份时大概需二十分钟;恢复时大概需要八小时,都快哭了π_π
svnadmin hotcopy
- 原设计目的估计不是用来备份的,只能进行全量拷贝
- 备份过程较快,灾难恢复也很快
- 需要硬盘空间支持,备份时数据大小跟库大小差不多
- 恢复时库的
svnserve.conf
里的password-db
和authz-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
# 查看库的最新版本数
比对阿里云的库版本跟内网的库版本,一致,那就不管了,代码完整就可以了ʅ(´◔౪◔)ʃ