The backup strategy for subversion repositories
(English version is under construction)
そこら中に資料はあっても具体的運用方法に関する記述が少ないように感じたので、subversionリポジトリのバックアップストラテジーを考えてみました。以下のような方法です。
提案
- subversion ツール群についての知識がある場合は、svnadmin dump と hot-backup.py を組み合わせて使う。前者はフックスクリプトとして利用し、コミット毎のダンプを取得する。後者は週次ミラーリングに利用する。
- 簡易な方法として、rsync を使う方法。シングルユーザで利用していたり、更新頻度がそれほどでもないレポジトリであれば有効。
- まったくわからない場合は手出ししないで、製品を買う。
設定方法
post-commit フックスクリプトを記述する
レポジトリ生成直後には、hookディレクトリにいくつかのサンプルが置かれている。
tmishina-macmini:/data/svn tmishina$ svnadmin create sample tmishina-macmini:/data/svn tmishina$ ls sample/ total 16 -rw-r--r-- 1 tmishina admin 379 5 6 11:57 README.txt drwxr-xr-x 4 tmishina admin 136 5 6 11:57 conf drwxr-xr-x 2 tmishina admin 68 5 6 11:57 dav drwxr-sr-x 10 tmishina admin 340 5 6 11:57 db -r--r--r-- 1 tmishina admin 2 5 6 11:57 format drwxr-xr-x 11 tmishina admin 374 5 6 11:57 hooks drwxr-xr-x 4 tmishina admin 136 5 6 11:57 locks tmishina-macmini:/data/svn tmishina$ ls sample/hooks/ total 72 -rw-r--r-- 1 tmishina admin 2014 5 6 11:57 post-commit.tmpl -rw-r--r-- 1 tmishina admin 1615 5 6 11:57 post-lock.tmpl -rw-r--r-- 1 tmishina admin 2254 5 6 11:57 post-revprop-change.tmpl -rw-r--r-- 1 tmishina admin 1542 5 6 11:57 post-unlock.tmpl -rw-r--r-- 1 tmishina admin 2932 5 6 11:57 pre-commit.tmpl -rw-r--r-- 1 tmishina admin 2016 5 6 11:57 pre-lock.tmpl -rw-r--r-- 1 tmishina admin 2763 5 6 11:57 pre-revprop-change.tmpl -rw-r--r-- 1 tmishina admin 1987 5 6 11:57 pre-unlock.tmpl -rw-r--r-- 1 tmishina admin 2136 5 6 11:57 start-commit.tmpl
まず post-commit.tmpl を post-commit に名称変更し、例えば以下のように記述する。
#!/bin/sh REPOS="$1" REV="$2" SVNADMIN=/sw/bin/svnadmin DUMPDIR=/data/backup/dump ZIP=/usr/bin/zip "$SVNADMIN" dump "$REPOS" -r "$REV" --incremental > "$DUMPDIR"/"$REV" $ZIP ${DUMPDIR}/${REV}.zip ${DUMPDIR}/${REV} rm ${DUMPDIR}/${REV}
このコードでは、コミットされたばかりのrevisionをダンプしてzipアーカイブに保存する(SVNADMIN, DUMPDIR, and ZIP は対象環境に合致するよう変更する)。DUMPDIRはレポジトリと物理的に異なるディスクにおいておくのがよい。
編集後、post-commitのパーミッションを755(実行属性付き)に変更しておく。
hot-backup.pyを設定する
hot-backup.pyはsubversion付属のホットバックアップツール(ホットバックアップでは、リポジトリが変更されている最中でもバックアップを取ることができる)。初期設定では64個のバージョンを保存することになっているが、実際には最新の1個さえあればよい(その1個は最新状態の完全なミラーになっている)ので、これを書き換える。hot-backup.py から以下の記述を見つけて、"64" を "1" に変える。
# Number of backups to keep around (0 for "keep them all") num_backups = 64
初期バックアップを作成する
コミットが発生する前に、hot-backup.py を使って初期バックアップ(ミラー)を作成しておく。例えば/data/svn/sampleというレポジトリを/data/backup/以下にミラーした場合は、以下のようにコマンドを実行する。
% hot-backup.py /data/svn/sample /data/backup
hot-backup.py は /data/backup/sample-1 というディレクトリを生成する。中身は /data/svn/sample と全く同じになっているはず。ここで「1」はバックアップ取得時点における最新リビジョン番号なので、環境によっては1ではないこともある。
スケジュールの作成
hot-backup.py によるミラーリングをスケジュールに載せる。スケジュールで実行する作業は以下の二つ。
- ミラー作成
- ダンプ削除
前述の通り、ミラーは完全なバックアップになっているので、その時点までのダンプファイルは必要なくなる。ゆえにダンプファイルはこの時点で削除してよい。
スケジューリングの方法はOSによって異なる。例えば OpenSUSE 10 であれば、以下のようなスクリプトを /etc/cron.daily/ にコピーして、実行属性をセットしておく。
#! /bin/sh REPOS=/data/svn/sample BACKUPDIR=/data/backup DUMPDIRNAME=dump HOTBACKUP=/sw/share/svn/tools/hot-backup.py ${HOTBACKUP} ${REPOS} ${BACKUPDIR} && rm ${BACKUPDIR}/${DUMP}/*.zip