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

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


現在、我が家では1台のLinux箱が常時起動しており、NASSubversionサーバー兼ビデオレコーダー兼PSP用動画エンコーダーLinuxプログラミングの実験場として働いています。最近では fetchmail + procmail + IMAPサーバーによるメール保存サーバーとしての役目も兼ねるようになりました。最初は、ほとんど遊び場Onlyの用途だったのですが、今ではこいつが無くなるとかなり困る、大事な存在となっています。

以前ちらっと書きましたが、現在のこいつのOSは Fedora Core 6 なので、アップデートサポート期間は昨年末に切れてしまっています。 外部からのパケットは届かない所に置いていますし、このLinux箱から外へのアクセスも、fetchmailなどの一部のアプリケーションを除いてありませんので、セキュリティをガチガチに気にする必要はあまり無いのかもしれませんが、さすがに気持ち悪いので、そろそろアップデートしようかと思います。

遊び場から生活必需品に昇格しているので、そろそろ、長期サポートのあるCentOSあたりに乗り換えるべきかもしれません。

ともかく、今日はその下準備として、Subversionリポジトリのバックアップの話題です。一応、定期的にバックアップはとっていますが、OSの入れ替え前には手動の退避も必要ですので、その時のためにまとめてメモを残しておきます。

単純なコピー

Subversionリポジトリをバックアップする場合、もっとも簡単なのは、リポジトリのファイルをまるごとコピーしてしまう、という物です。

$ tar cjvf ~/myrepos.dump.bz2 -C /var/svnrepos/ myrepos

まぁ、これでも大抵の場合は問題は無いのですが、運悪く誰かがアクセス中だったりすると、不完全なバックアップになる可能性があります。また、バックアップしたリポジトリを別のサーバーに移して動かそうとしても、Subversionのバージョン(や、Berkeley DBを使っている場合はそのバージョン)の違いによって動かない可能性があります。たとえば、Subversionの1.4以前と現行のものでは、リポジトリの構造に互換性がありません。*1

svnadmin dump

Subversionリポジトリをバックアップするための、もっとも基本的な方法は、svnadmin の dump サブコマンドを使う方法でしょう。

$ svnadmin dump /var/svnrepos/myrepos | bzip2 > ~/myrepos.dump.bz2

これで作成したダンプファイルは互換性が高いフォーマットになっています。復旧させる場合は、新しくリポジトリを作成してloadします。

$ svnadmin create /var/svnrepos/newrepos
$ bzcat ~/myrepos.dump | svnadmin load /var/svnrepos/newrepos

原理としてはこれで完全なバックアップがとれるので、手動でバックアップをとる場合にはこの方法を覚えておけば完璧です。

ただ、日常的に頻繁にバックアップをとったり、cronで自動的にバックアップをとらせたい場合には、もうちょっと使い勝手の良いスクリプトが欲しくなる所でしょう。

subversion-tools

Subversion には svnadmin/svn コマンドの他にも、いくつかの便利なスクリプトが同梱して配布されています。それらのスクリプトの中にはバックアップに関するものもいくつかありますので、日常的に自動バックアップを行うつもりの方は、まずそれらのスクリプトを試してみてはいかがでしょう。

Fedoraの場合はSubversionパッケージのドキュメントとして /usr/share/doc/subversion-?.?.?/tools/ 以下にインストールされます。

一方、Ubuntuの場合は subversionパッケージとは別に、subversion-toolsという名前のパッケージとして用意されていますので、それをインストールすれば、/usr/bin/配下にスクリプトがインストールされます。

$ sudo apt-get install subversion-tools
hot-backup.py (svn-hot-backup)

hot-backup.py は、Berkeley DB をバックエンドとして利用しているSubversionリポジトリのホットバックアップを安全にとるためのスクリプトです。

実行するたびに、指定したディレクトリにリポジトリフルバックアップを固めたdumpファイルが作成されます。

バックエンドがFSFSの場合は単にdumpするだけでよいはずですが、このスクリプトではダンプしたファイルの圧縮をしてくれますし、最新の数件(デフォルトでは64個)のバックアップを残し、それより古いバックアップファイルを自動で消したりしてくれるので、cronで定期的に動かすバックアップスクリプトとして便利に使えます。

使い方はオンラインヘルプでご確認ください。

[FC6]$ /usr/share/doc/subversion-?.?.?/tools/backup/hot-backup.py --help
[Ubuntu]$ /usr/bin/svn-hot-backup --help
svn-backup-dumps.py

このスクリプトsvn-hot-backup と似た機能を持っていますが、インクリメンタルバックアップの機能があったり、バックアップ保存先として、ftpやsmbサーバーを指定できたりしますので、NASや遠隔地のサーバーにバックアップを保存するのも、このスクリプトでできてしまいます。

使い方は、スクリプトの先頭に詳しく書いてあるので、そちらを参照してください。Ubuntuの場合は同等の情報がmanpageにもなっています。

[FC6]$ less /usr/share/doc/subversion-?.?.?/tools/server-side/svn-backup-dumps.py
[Ubuntu]$ man svn-backup-dumps

バックアップは慎重に

いずれの方法を使っても、きちんとバックアップをとることができますが、操作を間違えると大事なリポジトリを壊しかねません。実際に運用する際には、テスト用のリポジトリをつくってそちらで試してから導入するなど、慎重に行ってください。

また、保存していたデータが不正なバックアップで復旧不能だったりすることもありえますので、保存できたデータからリポジトリを復旧するテストもしておきましょう。

*1:ちなみに、checkoutしたworking copyの中にある.svnディレクトリもバージョンによって互換性を失ったりするので、複数マシン間でworking copyを共有しちゃいけません