svn-hot-backupを使ったSubversionリポジトリの複数世代のフルバックアップ検証メモ

# 環境
- CentOS 5.9 Final
- Subversion 1.6.11-11.el5_9 
- Python 2.4.3

# 概要
svn-hot-backupを使ったSubversionリポジトリの複数世代のフルバックアップ。
cronを用いる。

- svn-hot-backupについては下記の記事が詳しい。
    http://d.hatena.ne.jp/pasela/20090206/svn_backup
- hot-backup.pyを起動するスクリプトは下記の記事を参考にした。
    http://jehupc.exblog.jp/tags/SubVersion/

- 異常検知はsyslogdの出力ファイルの監視で実現する予定。本記事には含まない。

# 環境導入
ただし、OSはセットアップ済みとする。

```bash:subversionのインストール
yum install subversion.x86_64
```

```bash:リポジトリの作成
mkdir -p /data/repository
cd /data/repository
svnadmin create projectA --fs-type fsfs
svnadmin create projectB --fs-type fsfs
```

```bash:バックアップディレクトリの作成
mkdir -p /backup/repository
```

```bash:検証用のコミットをcron仕込み
mkdir -p /data/checkout/
cd /data/checkout
svn checkout file:///data/repository/projectA
svn checkout file:///data/repository/projectB
```

```bash:auto_commit.sh
#!/bin/sh
FILE=`date +"%Y%m%d%H%M%S"`

cd /data/checkout/projectA
touch $FILE
svn add $FILE
svn commit -m "$FILE commit."

cd /data/checkout/projectB
touch $FILE
svn add $FILE
svn commit -m "$FILE commit."
```

```bash:svn_backup.sh
#!/bin/sh

REPO_DIR=/data/repository
BAK_DIR=/backup/repository
HOT_BACKUP=/usr/share/doc/subversion-1.6.11/tools/backup/hot-backup.py 

EXIT_STATUS=0
# 保存世代数
export SVN_HOTBACKUP_BACKUPS_NUMBER=7

for REPO in `find $REPO_DIR -maxdepth 1 -mindepth 1 -type d`
do  
  $HOT_BACKUP --archive-type=gz $REPO $BAK_DIR
  if [ $? = 0 ]; then
    logger "SVN Backup done. repository:$REPO, $BKFILE"
    echo "SVN Backup OK $BKFILE"
  else 
    logger "SVN Backup NG $BKFILE"
    echo "SVN Backup NG $BKFILE"
    EXIT_STATUS=1
  fi  
done

exit $EXIT_STATUS
```

```bash:コミットとバックアップの定期実行
# テストなんで実行ペースは早くしてます。
crontab -e

* * * * * /data/script/incremental_commit.sh 1>/dev/null
*/5 * * * * /data/script/svn_backup.sh 1>/dev/null
```

# 実行経過

```bash:svn_backup.shの出力例
Beginning hot backup of '/data/repository/projectB'.
Youngest revision is 1
Backing up repository to '/backup/repository/projectB-1'...
Done.
Archiving backup to '/backup/repository/projectB-1.tar.gz'...
Archive created, removing backup '/backup/repository/projectB-1'...
SVN Backup OK 
Beginning hot backup of '/data/repository/projectA'.
Youngest revision is 1
Backing up repository to '/backup/repository/projectA-1'...
Done.
Archiving backup to '/backup/repository/projectA-1.tar.gz'...
Archive created, removing backup '/backup/repository/projectA-1'...
SVN Backup OK 
```

```bash:出力ファイル
[root@localhost repository]# ll
total 6336
-rw-r--r-- 1 root root  288771 May 29 15:45 projectA-520.tar.gz
-rw-r--r-- 1 root root  293589 May 29 15:50 projectA-524.tar.gz
-rw-r--r-- 1 root root  301862 May 29 15:55 projectA-529.tar.gz
-rw-r--r-- 1 root root  308573 May 29 16:00 projectA-534.tar.gz
-rw-r--r-- 1 root root  315250 May 29 16:05 projectA-540.tar.gz
-rw-r--r-- 1 root root  318863 May 29 16:10 projectA-544.tar.gz
-rw-r--r-- 1 root root  330825 May 29 16:15 projectA-550.tar.gz
-rw-r--r-- 1 root root  294565 May 29 15:45 projectB-527.tar.gz
-rw-r--r-- 1 root root  303877 May 29 15:50 projectB-532.tar.gz
-rw-r--r-- 1 root root  308243 May 29 15:55 projectB-537.tar.gz
-rw-r--r-- 1 root root  313657 May 29 16:00 projectB-542.tar.gz
-rw-r--r-- 1 root root  323662 May 29 16:05 projectB-548.tar.gz
-rw-r--r-- 1 root root  330473 May 29 16:10 projectB-553.tar.gz
-rw-r--r-- 1 root root  338349 May 29 16:15 projectB-558.tar.gz
```