3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(Linux)Subversionのバックアップ処理をhot-backup.pyを使って行う

当初、Subversionのバックアップは普通にリポジトリのファイルをシェルスクリプトでコピー(cp)するだけで考えてました。

しかし、そのままコピーしたのではまずいようです。

リポジトリ領域にアクセスするプロセスがなければ通常コピーでも構わないのですが、何かがアクセスしていると整合性が取れなくなるようです。

TortoiseSVNのヘルプでは、svnadmin hotcopy を使う方法が推奨されてました。

svnadmin hotcopy でリポジトリをコピーすると、整合性を保ったまま安全にリポジトリをまるごとコピー出来るようです。

書式としては下記のようになります。

svnadmin hotcopy path/to/repository path/to/backup --clean-logs

しかし、svnadmin hotcopy はリポジトリを全く同じものを安全にコピーするだけなので、アーカイブ化や世代管理などはできません。

これをアーカイブ化、世代管理ができるようにしたのが、svnadmin hotcopy をラッピングした hot-backup.py スクリプトです。

今回はCentOS5.5を使ったんですが、Redhat系は、/usr/share/doc/subversion-x.x.x/tools/backup にあるようです。

UbuntuなどのDebian系はsubversion-toolsというパッケージをインストールするとsvn-hot-backupコマンドとして使えるようになるようです。

世代管理は、subversion 1.4 付属の hot-backup.py だとスクリプト内の変数の値を変えないといけません。

hot-backup.py スクリプト内の先頭の方に、num_backups = 64 てのがあります。

この変数が残す世代数のようです。64は大きいので適宜調整します。

Subversion 1.6 付属の hot-backup.py だとスクリプト内の num_backups 変数が int(os.environ.get("SVN_HOTBACKUP_BACKUPS_NUMBER", 64)) となっています。

ここの値を直接書き換えることもできますし、環境変数 SVN_HOTBACKUP_BACKUPS_NUMBER を使うこともできるようです。

シェルスクリプトから呼び出す場合は、環境変数を使ったほうが楽かもしれません。

書式は、下記のとおりです。

./hot-backup.py リポジトリパス バックアップディレクトリパス

オプションで、--archive-type=圧縮形式 で指定した形式で圧縮してくます。

圧縮形式は、bz2 , gz , zip から選べます。

例:

./hot-backup.py --archive-type=gz /var/www/svn/devloprepo /var/backup/svn

これをスクリプト化してcronから呼ぶようにすると自動的にバックアップできますね。

とりあえず、cronから呼ぶスクリプトを作成してみました。

#! /bin/sh

#このスクリプトのパスを取得

MYPATH=$(cd $(dirname $0);pwd)

#hot-backup.py のパスを指定。CentOS5.5だと下記の場所にある。

SCRIPT_PATH=/usr/share/doc/subversion-1.4.2/tools/backup/hot-backup.py

#1.6付属の hot-backup.py を使った場合下記のように環境変数に世代数を入れることもできます。

#export SVN_HOTBACKUP_BACKUPS_NUMBER=3

#-------バックアップ処理-------

#バックアップ元ファイル読み込みパスと保存ファイル名読み込み、ループ開始

cat ${MYPATH}/bksrc_svn.dat | grep -v \# | while read REPO_DIR BKUP_DIR

do

#バックアップ処理

$SCRIPT_PATH --archive-type=gz $REPO_DIR $BKUP_DIR

#成功したらその旨を表示かつ、ログに保存

if [ $? = 0 ]; then

logger "SVN Backup OK $BKFILE"

echo "SVN Backup OK $BKFILE"

else

#失敗したらその旨を表示かつ、ログに保存、メール送信

logger "SVN Backup NG $BKFILE"

echo "SVN Backup NG $BKFILE"

${MYPATH}/mailsend.sh "SVN バックアップ失敗通知" "実行バックアップスクリプト: ${0}

バックアップ対象: ${REPO_DIR}

Subversionバックアップに失敗しました。"

fi

done

bksrc_svn.datというファイル(上記スクリプトと同じディレクトリに保存)に、バックアップ対象のリポジトリパスとバックアップ先を定義します。

vi bksrc_svn.dat

/var/www/svn/test/ /var/backup/svn

/var/www/svn/webdate/ /var/backup/svn

/var/www/svn/devlop_java/ /var/backup/svn

処理に失敗したらメールを飛ばすようにしていますが、メールを飛ばす部分は、(Linux)シェルスクリプトでメールを送信するを参考してください。

参考:

Subversionリポジトリのバックアップ方法いろいろ - ぱせらんメモ

2007-07-11 - mir the developer

2007-05-06 - tmishina’s diary