是非に及ばず

プログラミングに関する話題などを書いていきます(主にRailsやAndroidアプリ開発について)

[Subversion] Subversionリボジトリのバックアップ方法についてまとめてみた

Gitが流行っている中、Subversionリポジトリのバックアップ方法をまとめるという残念なエントリ。
でも、正直自分が使うだけならGitでも構わないがメンバーが多くなってくると、
Gitは説明が面倒だし、Subversionのほうが楽だよなぁ・・・

結論

結論から言うと、svnadmin dumpとsvnsyncの両方を使う。
svnadmin dumpで差分バックアップをするという方法もあるようだけど、
差分だとうまく元に戻せる気がしない。
バックアップの目的は、任意の時点の状態に復元できる事のはず。
それなのに正しく復元できないとしたら、バックアップなど意味がないのだ。
だから、復元が簡単なフルバックアップをするほうがいい。
しかし、フルバックアップでは時間が非常にかかるので、1日に1回とか
そのくらいの頻度にしたほうがいい。
でも、それではデータの損失が大きい・・・
そこで、差分バックアップ的な感じで最新のリポジトリの状態を作れるsvnsyncを併用する。
フルバックアップには、svnadmin hotcopyを使う方法もあるようだけど、
アーキテクチャ依存なので微妙な感じ。
svnadmin dumpにはリビジョン欠けが起きる可能性があるという情報を目にしたが、
そう書いてる人たちは自分で経験した事もなくただネットで見たから・・
という事で書いている事が多いようだ。
そういう事は自分で経験してから書くもんだと思う。
なので、自分が経験するまではsvnadmin dumpを使います。

svndumpでフルバックアップ

※ここでは、リポジトリのパスを/var/svn/sampleとして説明する。

バックアップ方法

svnadmin dump /var/svn/sample > sample.`date +%Y%m%d%H%M%S`.svn.dump

復元方法

まず、現在のリポジトリを移動し、同じパスに空の状態のリポジトリを作成する

$ sudo su -
# mv /var/svn/sample /var/svn/sample.old
# svnadmin create /var/svn/sample
# chown -R apache:apache /var/svn/sample

ダンプファイルから復元する

# svnadmin load /var/svn/sample < sample.`date +%Y%m%d%H%M%S`.svn.dump

svnsync

準備として、バックアップ先のサーバで分かりやすいように同じパスに空のリボジトリを作り、
hookスクリプトにsvnsyncy用のファイルを作る。
ここでは、コピペでファイルを作れるようにechoの内容をファイルにリダイレクトしている。
echoの部分は、1行で出来るはずだけど、よく分からんので2行に分けているのがちょっとかっこ悪い・・・

$ sudo su -
# rep=/var/svn/sample
# svnadmin create $rep
# echo '#!/bin/sh' > $rep/hooks/pre-revprop-change
# echo "exit 0" >> $rep/hooks/pre-revprop-change
# chmod +x $rep/hooks/pre-revprop-change
# chown -R apache:apache $rep

svnsyncの初期化。なお、リモートのリポジトリhttps://example.com/svn/sample として説明する。

# svnsync init file:///var/svn/sample https://example.com/svn/sample --source-username \
ユーザ名 --source-password パスワード

うまく行ったら、次回からは以下のコマンドだけで良い。
これは差分だけ取得して来るので時間はかからないから、例えば5分ごとにcronで動かすとかやっても問題ないと思う。

# svnsync sync file:///var/svn/sample --source-username ユーザ名 \
--source-password パスワード