気ままなつぶやき

おべんきょしたこととか

【svn】バックアップをとりましょうの巻

(ΦωΦ)にゃ♪

今日はネコの日だって(ΦωΦ)

さてさて。svnのお話。

最近、とあるsvnを引き取ってくれといわれたので、引き取ったら、
バックアップが1年以上動いていなかった.....orz

てか、ディレクトリ毎まんまrsyncsしようとしてたらしく、それがこけてたよ|ωΦ)

svnにはsvnsyncという便利なコマンドがあります。
svnのミラーを作る感じ。
仮に本体が使えなくなっても、ミラーをとっておくとそっからデータを参照できたり、
最終的には本体に昇格させることも可能です

移行のときにも使えるよ(ΦωΦ)♪

前提

今回は、svnの本体はすでに存在してまふ。

svnのバージョンはこんな感じ。古め

$svn --version
svn, version 1.6.11 (r934486)

仮に、バックアップを取りたいリポジトリの名前をnekoとして
手順を説明していきます

バックアップ先のサーバさんの準備

バックアップ先のサーバさんにリポを作る

$cd /var/svn/repos
$/usr/bin/svnadmin create  neko

pre-revprop-changeを作る

svnsynvはフックの仕組みで動くので、リビジョンの変更可能にするために設定をいれます

cd neko/hooks
vim pre-revprop-change

pre-revprop-changeの中身はこれだけでOK。

#!/bin/bash
exit 0

フックスクリプトに実行権限を付与

$chmod +x pre-revprop-change

本体svnのuuidとバックアップ先のuuidをそろえる

#セット
$/usr/bin/svnadmin setuuid /var/svn/repos/neko ${本体svnのuuid}
#変更されていることを確認(本体のsvnのuuid調べるときもこのコマンド)
$/usr/bin/svnlook uuid neko

svn本体からsvnsyncの設定

本体に、ミラーさんはこのこだよって教える

※本体サーバ上で実行する

/usr/bin/svnsync init svn+ssh://${バックアップ先のIP}/var/svn/repos/neko svn+ssh://${本体svnのIP}/var/svn/repos/neko

今回はバックアップの方はhttpたててないので、svn+sshにしたよ

svnsync実行

$/usr/bin/svnsync sync svn+ssh://${バックアップ先のIP}/var/svn/repos/neko

動作確認

ちゃんとsyncできた?

最新のリビジョン番号みてみる

$/usr/bin/svnlook youngest neko

バックアップ先からチェックアウトできる?

適当なところからチェックアウトしてみて(ΦωΦ)♪

$svn checkout svn+ssh://${バックアップ先のIP}/var/svn/repos/neko
#なんとなくからじゃないよねーって確認した
$ ls 

ちなみに、下準備でsetuuidをちゃんとしてないと、
本体から、バックアップに切り替えたときに

svn: Repository UUID 'fecb33dc-96d4-4d15-a2d6-66e738cd1f83' doesn't match expected UUID '7c6c9d4a-4ae7-452e-9002-9b899cebdb0f'

みたいなエラーがでてうっとおしいよ

そのほか

全然本質じゃないけど、大きなリポをバックアップ取るときは
バックグラウンドで流すのを忘れずに。。

$nohup /usr/bin/svnsync sync svn+ssh://${バックアップ先のIP}/var/svn/repos/neko &

バックアップ先で様子見など。。

$while true; do svnlook youngest repo; sleep 5; done 

もっといい方法があるかもしれないけど、ひとまず。。

追記

同期先リポジトリのロックを取得できませんでした。現在 'hostname:378ba4cd-6fc1-48fa-bb22-33e092a7d8bb' が所持しています

途中でエラーになるとたまにでる

$ svn propdel svn:sync-lock --revprop -r 0 svn+ssh://${バックアップ先のIP}/data/svn/repos/neko
属性 'svn:sync-lock' をリポジトリのリビジョン 0 から削除しました

svnsync: Error while replaying commit

なんか、ファイル名に空白が入っていたよ(つд⊂)エーン
空白いやよー。

スキップオプションとかないので、こけたリビジョンのsvn diffとって

$svn diff -r 146:147 svn+ssh://${本体のIP}/var/svn/repos/neko

その変更をシンク先にコミット|o゚д゚)

なんかsync先のリビジョン番号をみているみたいなので、
うまくスキップできました。。。。

力技。。もっといい方法があるやも