Subversionのリポジトリの保守~バックアップ・コピー・クリーンアップ~

はじめに

リポジトリを保守していますか?サーバー同様、Subversionのリポジトリも定期的なメンテナンスが必要です。もし、何もしていなければ、障害が発生した時にリポジトリにアクセスできなくなってしまいます。復旧できるならまだマシですが、最悪の場合リポジトリが失われてしまいます。リポジトリはコードが格納される大切な場所です。面倒がらずにメンテナンスを欠かさずに行いましょう。

この記事では、Subversionのリポジトリのバックアップやコピー、クリーンアップについてチュートリアル形式でお伝えしていきます。万が一の際にも、しっかり対応できるようにしておきましょう。

Subversionのリポジトリの保存形式

Subversionでリポジトリを作成すると、「FSFS」という形式で保存されます。これはデータベースではない、ファイルシステムを使った保存形式です。多数のディレクトリとファイルで構成されています。以前は「Berkeley DB」という形式も使われていましたが、壊れやすいこともあり非推奨となりました。いくらFSFSが堅牢な保存形式とはいえ、障害は起こります。リポジトリ自体の障害もそうですが、サーバーの物理障害なども考えなくてはいけません。最低限、バックアップだけは行う必要があります。

リポジトリの作成

Subversionのインストール

練習台となるリポジトリを作成するために、まだSubversionをインストールしていない方は、下記の公式サイトからダウンロードしてインストールしておいてください。

新しいリポジトリの作成

それでは、新しいリポジトリを「tuto-repo」という名前で作成しましょう。コマンドプロンプト(コンソール)から、下記のコマンドを入力してください。

svnadmin create tuto-repo

これで新しいリポジトリが作成されました。

ファイルのインポート

次に、「example.txt」ファイルを下記の内容で作成し、リポジトリにインポートしましょう。なお、コマンドのパスは適宜読み替えてください。

hogehoge
fugafuga

svn import example.txt file:///C:/Users/Test/Desktop/tuto-repo/example.txt -m ファイルのインポート

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial5_01.png

これでリポジトリの準備ができました。このリポジトリを使って、チュートリアルを進めていきましょう。

リポジトリのバックアップ

リポジトリをバックアップする最も単純な方法は、ディレクトリをコピーすることです。しかし、この方法ではリポジトリが一貫性のない状態でバックアップされる可能性があります。バックアップの最中にも、コミットなどでリポジトリが変更される可能性があるからです。そのため、専用のコマンドを使ってバックアップを行う必要があります。

ここでは、「svnadmin dump」コマンドを使ったフルバックアップと差分バックアップについて説明します。

フルバックアップ

フルバックアップは、リポジトリ全体をダンプする方法です。リポジトリが大きい場合には、ファイルサイズが大きくなるため、後述する差分バックアップと組み合わせて使います。小さいリポジトリであれば、フルバックアップだけで十分です。なお、リポジトリが使用中であっても正常にバックアップできます。

それでは、先ほど作成したリポジトリをフルバックアップしてみましょう。「svnadmin dump」コマンドの出力を「full-dump.bak」ファイルにリダイレクトしています。なお、リポジトリの指定は、通常のパス表記になりますので注意しましょう。

svnadmin dump tuto-repo > full-dump.bak

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial5_02.png

すべてのリビジョンがダンプされ、バックアップファイルが作成されました。これは各リビジョンを記録したテキストファイルになっています。テキストエディタで確認してみましょう。先ほどコミットしたファイルの内容がそのまま見て取れます。

差分バックアップ

差分バックアップは、特定のリビジョンを指定してダンプする方法です。フルバックアップを行った後に、それ以降のリビジョンをバックアップするために使われます。このほうがファイルサイズを削減でき、効率的にバックアップを行えます。なお、復元(復旧)する際には、フル+差分バックアップのすべてのファイルが必要です。

差分バックアップをする前に、対象とするリビジョン(コミット)を作成しましょう。先ほどのリポジトリを「work」ディレクトリにチェックアウトして、「example.txt」ファイルの最終行に下記のテキストを追加します。

piyopiyo

mkdir work
cd work
svn checkout file:///C:/Users/Test/Desktop/tuto-repo

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial5_03.png

ファイルを保存したら、コミットしましょう。

cd tuto-repo
svn commit -m テキストを追記しました

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial5_04.png

それでは、今コミットした「リビジョン2」を差分バックアップしてみましょう。「svnadmin dump」コマンドに、対象とするリビジョン番号を指定して実行します。実行結果は、「incr-dump.bak」ファイルにリダイレクトします。なお、「0:2」のように指定することで、複数のリビジョンを対象にすることもできます。

cd ../..
svnadmin dump --incremental --revision 2 tuto-repo > incr-dump.bak

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial5_05.png

これで差分バックアップが実行され、バックアップファイルが作成されました。作成されたファイルをテキストエディタで開いてみましょう。「リビジョン2」のみが含まれていることが確認できますね。

バックアップからの復元

リポジトリが破損してしまった時には、取得しておいたバックアップからリポジトリを復元しましょう。ここでは、先ほど取得したバックアップファイルを使って、新しいリポジトリに復元します。

フルバックアップから復元

まず、「tuto-repo2」という名前で新しいリポジトリを作成し、そこにフルバックアップをロードします。「svnadmin load」コマンドに、バックアップファイルをリダイレクトします。

svnadmin create tuto-repo2
svnadmin load tuto-repo2 < full-dump.bak

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial5_06.png

これでフルバックアップからの復元ができました。続けて、差分バックアップからの復元を行います。

差分バックアップからの復元

次に、同様の手順で差分バックアップからの復元を行います。ロードする順番を間違えないようにしましょう。なお、複数のファイルがある場合には古い方から順番にロードします。

svnadmin load tuto-repo2 < incr-dump.bak

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial5_07.png

これで復元が完了しました。うまく復元できているか確認してみましょう。

復元したリポジトリの確認

「work2」ディレクトリに作業コピーをチェックアウトして、リポジトリの内容を確認します。

mkdir work2
cd work2
svn checkout file:///C:/Users/Test/Desktop/tuto-repo2

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial5_08.png

ファイルを確認すると、「tuto-repo」と同じ内容になっていますね。バックアップを取っておけば、リポジトリを簡単に復元できます。リポジトリとは別のドライブに、定期的に取得しておきましょう。

リポジトリのコピー

リポジトリをバックアップするのではなく、いつでも使えるようにミラーリングしておきたい場合もあります。そんな時は、「svnadmin hotcopy」コマンドを使って、リポジトリをコピーしましょう。名前の通り、このコマンドはリポジトリが使用中でも問題なくコピーできます。

それでは、「tuto-repo」リポジトリを「tuto-repo3」としてコピーしてみましょう。なお、「–clean-logs」オプションを付けると、不要なログファイルを削除してコピーできます。

cd ..
svnadmin hotcopy tuto-repo tuto-repo3

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial5_09.png

コマンドの出力は何もありませんが、これでリポジトリがコピーできました。作業コピーを「work3」ディレクトリにチェックアウトして確認してみましょう。

mkdir work3
cd work3
svn checkout file:///C:/Users/Test/Desktop/tuto-repo3

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial5_10.png

ファイルを確認すると、問題なくコピーされていますね。緊急時の予備リポジトリにするなど色々と活用できるでしょう。

リポジトリのクリーンアップ

滅多にありませんが、プロセスの異常終了などが原因でリポジトリの状態がおかしくなってしまうことがあります。例えば、ファイルがロックされてコミットできないといった状況です。そんな時は、リポジトリを復元する前に「cleanup」コマンドを試してみましょう。

先ほど「tuto-repo」リポジトリからチェックアウトした、「work」ディレクトリの作業コピーに対して実行してみます。

cd ../work/tuto-repo
svn cleanup

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial5_11.png

コマンドの出力は何もありませんが、不正にロックされているファイルがあれば解除されます。作業コピーでロックエラーが出る場合には、まずこの方法を試してみましょう。

まとめ

リポジトリの保守の仕方が分かりましたか?リポジトリを正常な状態に保てるよう、定期的にメンテナンスしましょう。バックアップやコピーなどは、バッチスクリプトやフックスクリプトにすると忘れずに実行できます。リポジトリは、必ず専用のコマンドを使ってバックアップしてください。通常のファイルコピーでは、リポジトリの一貫性を保てない可能性があります。正しい方法でリポジトリを保守していきましょう。

参考資料


社内サーバにリモートリポジトリを作るのも一つですが、「開発にまつわる面倒事」をこの際全部、tracpath(トラックパス)に任せてみませんか?
バージョン管理サービス・プロジェクト管理サービスの「tracpath(トラックパス)」では、
ユーザー5名、リポジトリ数3つまで、無料で利用可能です。

さっそく実務でも使って見ましょう。
自らも開発を行う会社が作ったからこそ、開発チームの「作る情熱」を支える、やるべきことに集中出来るサービスになっています。
エンタープライズ利用が前提のASPサービスなので、セキュリティも強固です。