阿里云服務器快到期了,要把公網的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會執(zhí)行熱拷貝操作,然后刪除不用的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
導完之后發(fā)現(xiàn)有個庫少了30M。。。
然后使用svnadmin hotcopy
又備份了一次,發(fā)現(xiàn)也是少30M,猜想是緩存之類的數據
svnlook youngest x
# 查看庫的最新版本數
比對阿里云的庫版本跟內網的庫版本,一致,那就不管了,代碼完整就可以了?(′???)?