今回のテーマは、Subversionのバックアップとリストアについて。1.10(バージョン依存はあまりないはずだが一応)バックアップの色々Subversionのバックアップ手段はいろいろ用意されているが、定期的に自動で取得することを前提に考えた際の事を考えて見る。Windowsならrobocopyを使用したスクリプトを作成して差分バックアップを取得する。他のバックアップ手段を執るにしてもこれは「念のため」やっておく。これの欠点は「書き込みモードで開いているファイルは壊れてコピーされるかも知れない」という点で、これを回避するため、誰もアクセスしていない夜間時間帯に自動実行するのが良いだろう。これで取得したバックアップは、そのままリポジトリに上書きすれば使える。rsyncやrobocopyのよいのは差分で取得できる点。週末にフルバックアップを取得して、平日の夜間は差分で取得する、などとすればよい。リポジトリの親ディレクトリを指定して実行すれば、後でリポジトリが増えても自動で取ってくれるから。リポジトリのバックアップでこの方法を取らなかったとしても、hookスクリプトやconfファイルなどのバックアップはこれで取っておくと良いだろう。hotcopyはリポジトリのフルコピーを取得できる。ファイルが開いていても可能なホットバックアップだ。そのままリポジトリに戻せば使える。スナップショットを取得するにはいいのだが、フルバックアップなので時間も掛かるので週末の夜間に取得のがよいだろう。リカバリの際にhotcopy単独で戻すと言うよりは後述するDumpとの合わせ技になる。dumpはリポジトリのダンプをしてくれる。フルでダンプするのはこれでいいのだが、自動実行して増分バックアップをする際には問題がある。dumpでは増分を取るにはリビジョンを指定しなければならない。なると、スクリプトの中で最新リビジョン番号を取得して、計算して・・・とやらねばならないことになる。Subversionの標準コマンドではないが、これをやってくれるスクリプトが、svn-dump-backups.pyだ。Pythonで書かれたスクリプトなのでPython(Python2)の実行環境が必要であるが、増分ダンプを取るのに非常に使い勝手が良い。バックアップ先のパス(-i、は増分だけを取得するオプション)すると、リポジトリ名.開始リビジョン-終了リビジョン.svndmpという名前でダンプファイルを作ってくれる。samplerepo.000025-000050.svndmpといった具合に。どのリポジトリのどのリビジョンが含まれるか一目瞭然なので便利。制作年度が古いのかpython2でないと動かない、という情報があり、弊社で構築する場合もPython2と一緒に入れている。svnsyncリアルタイムのバックアップが欲しい、という人も多い。Subversionは完全ではないがリアルタイムに近いバックアップを取得する手段を用意している(完全ではないのは、データベースのようなロールバックの仕組みはなく、マスタ側のコミット「後」に取るため、障害時のリカバリはマニュアルだからだ)。これがsvnsyncだ。多くのサイトで実装されている。転送元URL(file:///....)と書いておく。すると、マスタ側のコミットが終了するとスレーブ側にその内容を転送するのだ。スレーブ側はマスタと同じ内容のコミットをローカルで行う。svnsyncの失敗をエラーにするには、スクリプト内でエラー処理すし、終了時にゼロではないコードを返すように作る必要がある。問題はバックアップを使って戻す作業だろう。ステップ1は、前の#1から#3のバックアップを使ってバッチで取得した時点(日次なら前日)までリポジトリを戻すこと。その際、#3のダンプはリポジトリの中だけしか戻さない。hooks配下は戻してくれないので他のバックアップから持ってくる必要があるので注意。「どこまで戻ったか」を確認する。これは後で更に最新化する際に使う。(前の#1~#3で復旧したリポジトリの最新のリビジョンが50、の場合)そしてステップ2、今度はスレーブ側でダンプを取得する。ダンプファイル名(50までは要らないので、51から最新までを取得)これをマスタ側にコピーする。ダンプファイル名でロードする。リポジトリの内容の全部を戻すこともできるが、時間が掛かるのでhotcopyなどを使ってある程度近いところまで戻した方が早い。--no-flush-to-diskオプションを使う事も検討。svnsyncは、動かすのは比較的容易だが、取ったバックアップを使ってどうやって戻すか、は他のバックアップも含めてやや複雑と思われる。面倒くさいからとスレーブのリポジトリをマスタに丸コピーしても動作しないので注意。クライアントから見ればUUIDというリポジトリの識別子が違うのでエラーになるし、マスタとスレーブではフックスクリプトも異なるはずだから。お問い合わせくださいOSSPlazaでは、Subvesrionサーバの構築やサポートを行っています。サーバの構築や入れ替えを検討中であれば、ぜひお問い合わせください。