[Subversion] Subversionリボジトリのバックアップ方法についてまとめてみた
Gitが流行っている中、Subversionリポジトリのバックアップ方法をまとめるという残念なエントリ。
でも、正直自分が使うだけならGitでも構わないがメンバーが多くなってくると、
Gitは説明が面倒だし、Subversionのほうが楽だよなぁ・・・
結論
結論から言うと、svnadmin dumpとsvnsyncの両方を使う。
svnadmin dumpで差分バックアップをするという方法もあるようだけど、
差分だとうまく元に戻せる気がしない。
バックアップの目的は、任意の時点の状態に復元できる事のはず。
それなのに正しく復元できないとしたら、バックアップなど意味がないのだ。
だから、復元が簡単なフルバックアップをするほうがいい。
しかし、フルバックアップでは時間が非常にかかるので、1日に1回とか
そのくらいの頻度にしたほうがいい。
でも、それではデータの損失が大きい・・・
そこで、差分バックアップ的な感じで最新のリポジトリの状態を作れるsvnsyncを併用する。
フルバックアップには、svnadmin hotcopyを使う方法もあるようだけど、
アーキテクチャ依存なので微妙な感じ。
svnadmin dumpにはリビジョン欠けが起きる可能性があるという情報を目にしたが、
そう書いてる人たちは自分で経験した事もなくただネットで見たから・・
という事で書いている事が多いようだ。
そういう事は自分で経験してから書くもんだと思う。
なので、自分が経験するまではsvnadmin dumpを使います。
バックアップ方法
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 パスワード