MySQLバックアップツール "MySQL ZRM"

MySQLデータのバックアップ方法 | OSDN Magazineにて紹介されていたMySQL用のバックアップツール
Zmanda Recovery Manager for MySQL を使ってみることにしました。Zmanda Recovery Manager for MySQLの特徴は上記のSourceForgeの記事の下の方で紹介している箇所をご覧ください。

インストール

RedHat系用ではRPMファイルが配布されているのでwgetしてインストールします。

wget http://www.zmanda.com/downloads/community/ZRM-MySQL/2.2/RPM/MySQL-zrm-2.2.0-1.noarch.rpm
rpm -ivh MySQL-zrm-2.2.0-1.noarch.rpm

Debian系はMySQLデータのバックアップ方法 | OSDN Magazineに書いてあるようにhttp://www.howtoforge.com/mysql_zrm_debian_sargeを参照するといいとか。
MySQL-ZRMでは「バックアップセット」という単位でバックアップが実行されます。
ここでは"MyBackupSet"という名前のバックアップセットを作っておきます。(名前は適宜変更してください)

mkdir /etc/mysql-zrm/MyBackupSet/
cp /etc/mysql-zrm/mysql-zrm.conf /etc/mysql-zrm/MyBackupSet/
chown mysql:mysql -R /etc/mysql-zrm/MyBackupSet/
chmod 775 /etc/mysql-zrm/MyBackupSet/
chmod 644 /etc/mysql-zrm/MyBackupSet/mysql-zrm.conf

インストールしたらバックアップ処理専用のDBユーザを作っておきましょう。
私の場合は"backup_operator"という名前で、SELECT, RELOAD, SHUTDOWN, SUPER, LOCK TABLES, REPLICATION CLIENT のグローバル権限を付与したユーザをバックアップ処理用ユーザとしました。

バックアップを実行する

バックアップを実行するときにはmysql-zrm-backupコマンドを使います。以下のように、実行するバックアップセットの名前を指定する必要があります。(省略時は"BackupSet1"が使用されます)

mysql-zrm-backup --backup-set=MyBackupSet
差分バックアップを取得する

差分バックアップを取得するためにはバイナリログが有効になっている必要があります。
/etc/my.cnfの[mysqld]セクションに以下の二行を追加してからmysqldを再起動しましょう。(パスや値は適宜変更してください)

log_bin=/var/lib/mysql/mysqld-bin
max_binlog_size = 512M

mysql-zrm-backupコマンドはバイナリログの場所をmy.cnfからは読み取らないので、my.cnfでmysql-zrm-backupのデフォルト値(/var/mysql/mysqld-bin)以外を指定する場合はそのパスをmysql-zrm.confに書くか、--mysql-binlog-pathオプションで指定する必要があります。
参考:
http://dev.mysql.com/doc/refman/5.1/ja/binary-log.html
http://open-groove.net/mysql/mysql-binlog/

バックアップデータを暗号化する

バックアップデータを暗号化して保存する場合はmysql-zrm.conf内で

encrypt=1

の行を有効にして、パスフレーズファイルとして /etc/mysql-zrm/.passphrase (中身は任意の文字列)を用意しておく必要があります。

echo -n hogemoge > /etc/mysql-zrm/.passphrase
chmod 600 /etc/mysql-zrm/.passphrase
chown mysql:mysql /etc/mysql-zrm/.passphrase

パスフレーズファイルのパーミッションと紛失には注意してください。

バックアップデータから復元する

復元する時には

mysql-zrm-restore --source-directory \
        /var/lib/mysql-zrm/MyBackupSet/20100517020503/
mysql-zrm-verify-backup --source-directory \
        /var/lib/mysql-zrm/MyBackupSet/20100517020503/

といった形で復元元データが格納されたディレクトリを指定して復旧と検証を行います。
バックアップからの復旧完了後、mysqldが停止した状態で完了するのでmysqldを再起動して復旧は完了です。

バックアップをスケジュールする

簡単なものであればmysql-zrm-schedulerコマンドで登録することができます。(実際はコマンド内からcronに登録しているだけのようです。)
具体的な使用方法はmanページをご覧ください。

手動でスケジュールを組みたい場合は自分でcrontabを編集してもいいでしょう。
以下は

を行う場合の設定例です。

# Full backup of mysql database on Every Monday 08:00
00 8 * * 1 root mysql-zrm-backup --backup-set MyBackupSet --backup-level 0 --backup-name "$(date '+\%Y-\%m-\%d')f"

# Incremental backup of mysql database on Every Monday-Friday 23:50
50 23 * * 1-5 root mysql-zrm-backup --backup-set MyBackupSet --backup-level 1 --backup-name "$(date +\%Y-\%m-\%d)i"

フルバックアップには保存先のディレクトリ名に "f" を、差分バックアップの場合は "i" を付加してあります。(バックアップ実行時に保存先のディレクトリがすでに存在する場合、エラーとなってしまうので注意してください。)