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 によるミラーリングをスケジュールに載せる。スケジュールで実行する作業は以下の二つ。

  1. ミラー作成
  2. ダンプ削除

前述の通り、ミラーは完全なバックアップになっているので、その時点までのダンプファイルは必要なくなる。ゆえにダンプファイルはこの時点で削除してよい。

スケジューリングの方法は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