MySQLバイナリログの仕様

1月 17, 2010

MySQLのバイナリログについて、うっすらまとめてみようかと。

RDBMSで更新ログまたはトランザクションログと呼ばれているログの機能は、
MySQLでは「バイナリログ」が担っている。
これらの内容は、「CREATE TABLE文やINSERT文といったデータベースの中身を
変更する操作を行った際の操作履歴を追跡できる形で記録した情報」であり、
コミットされたトランザクションの情報が保存される。

トランザクションログの中身はRDBMSによって異なり、「論理ロギング」と
「物理ロギング」がある。「論理ロギング」はSQL文レベルで変更履歴を管理し、
「物理ロギング」は変更があったデータブロックをバイナリイメージとして管理する。
MySQLのバイナリログは論理ロギングだが、OracleのREDOログやInnoDBログは
物理ロギングである。

バイナリログはデフォルトでは作成されないので、my.cnfにてlog-binパラメータを設定する。

log-bin = /var/lib/mysql/blog/mybin-log


上記のように指定すると、/var/lib/mysql/blog/配下にmybin-log.000001のファイル名で
バイナリログファイルが作成される。

バイナリログの中身を確認
バイナリログはその名の通りバイナリ形式となっているため、中身を確認するには
mysqlbinlogというユーティリティを利用する。
以下のコマンドにより、バイナリログmybin-log.000001の内容を表示する。

# mysqlbinlg -D mybin-log.000001
※-D,–disable-log-bin バイナリログの出力を無効にする。


バイナリログの中身は、主に以下の内容となっている。

実行されたステートメント
実行に必要な時間
発行したクライアントのスレッドID
実行時のタイムスタンプ


バイナリログにはサイズ上限値があり、その上限値に達した時点でスイッチされる。
スイッチされるというのはつまり、「次の番号(拡張子の数値に1が足される)
のバイナリログに移行する」こと。サイズ上限値のデフォルトは1GBだが、
my.cnfのmax_binlog_sizeで指定することで変更可能。
他にインスタンス起動時にもスイッチされるし、以下のSQL文を発行して明示的に
スイッチさせることもできる。

mysql > FLUSH LOGS;

または
# mysqladmin flush-logs -u root -pxxxxxxx


バイナリログのスイッチ後は、過去のバイナリログに対しては一切更新は発生しなくなる。
このため増分バックアップとしての利用が可能で、障害発生時には直近の全体バックアップの
リストアと、増分バックアップしておいたバイナリログにより障害発生直前までのリカバリができる。
これを「ロールフォワードリカバリ」と呼ぶ。

余談だが自分の中で「リストア」と「リカバリ」の定義があやふやなので、ここに書いておく。

リストア → バックアップの時点まで復旧すること
リカバリ → 障害直前の時点まで復旧すること


ロールフォワードリカバリ時のコマンド例も書いておこう。

# mysqlbinlog -D -u root -pxxxxxxx /backup/mybin-log.000006 > /backup/recover.sql
※オプションで–database=”db_name”とすればデータベースを特定して実行可能。

# mysql -u root -pxxxxxxx < /backup/recover.sql


最初のコマンドでは、バイナリログ「mybin-log.000006」の中身をテキスト形式で
/backup/recover.sqlファイルに保存している。名称や配置場所は何でもよい。
適用対象のバイナリログが複数ある場合はスペースで区切って複数指定できるが、
量が多い場合は一度に変換するより個別に実施した方がいいかもしれない。
(一時ファイルのサイズは大きくなるため)
その次のコマンドはrecover.sqlに書かれたSQL文を実行させるための指示となる。

最後に、バイナリログのローテーションについて。バックアップ方針を決める際に注意したいこと。

全体バックアップとそれ以降のバイナリログがあればロールフォワードリカバリが可能なので、
基本的に「全体バックアップを取得したら、それ以前のバイナリログは削除して構わない」
という前提がある。が、最終バックアップ以前の時点にデータを戻す必要があるなら、
過去のバイナリログも必要になる。全体バックアップとバイナリログ合わせて、いつまでの
データを保存するのかは現場での運用ポリシーによるだろう。

うっすら、のつもりが結構「濃く」なってしまったような。。まぁいいか。

出典
「現場で使えるMySQL」松信嘉範著/翔泳社(が殆ど)



Categories: MySQL