この連載でも何度か紹介していますが、MySQLのレプリケーション方式には、ステートメントベースレプリケーション(SBR)と行ベースレプリケーション(RBR)があります。今回は行ベースレプリケーションにおいて、設定しておくと得するオプションについて紹介したいと思います。行ベースレプリケーションについては、過去の連載をご確認ください。
binlog_rows_query_log_events オプション
障害時やデバックするためにSQL文をバイナリログから調査することがあると思います。しかし、MySQL5.7以降のデフォルト設定(RBR)環境では実際に実行したSQL文(以後、オリジナルSQL)を確認することはできません。それを解決するためにbinlog_rows_query_log_events
オプションを使用します。
デフォルトはOFF(無効)で、その場合でも更新内容を推測できる疑似のSQL文(以後、疑似SQL)は確認することができます。ON(有効)にすると、RBR環境化でもマスターがオリジナルSQLをバイナリログに記録するようになります。そして、mysqlbinlog
コマンドを使用して、そのオリジナルSQLを確認することができます。ちなみに、このオプションはオンラインで設定変更可能です。
例として、以下パターンをmysqlbinlog
コマンドとオプションを付けて、バイナリログを確認してみます。オプションについては後述いたします。
①binlog_rows_query_log_events
を無効化して、INSERT INTO t0 (col1, col2) VALUES (1,'MODE_OFF');
というINSERT文を実行した後にバイナリログを確認します。
###
の部分のINSERT~
から疑似SQLが確認できます。しかし、オリジナルSQLではありません。
②次にbinlog_rows_query_log_events
を有効化して、INSERT INTO t0 (col1, col2) VALUES (2,'MODE_ON');
というINSERT文を実行した後にバイナリログを確認します。
Rows_query
が記述してある行の下に、オリジナルSQLが表示されているのがわかります。Rows_queryでgrepすることで検索することも可能となります。
mysqlbinlogコマンドのオプションについて
前項で、mysqlbinlog
コマンドに-vv
と--base64-output=DECODE-ROWS
のオプションを指定しました。binlog_rows_query_log_events
を有効化した環境で、バイナリログからオリジナルSQLを確認するためには-vv
オプションが必須となります。--base64-output=DECODE-ROWS
に関してはなくても大丈夫ですが、表示を見やすくするために、以下のBINLOG '
から始まるbase64文字列を表示させないように付けています。
ちなみに、 -vv
は--verbose
を2回指定したものと同様です。
-v
のみを指定すると疑似SQLのみを表示します。-vv
を指定すると疑似SQLと各カラムのデータ型と一部のメタデータも表示され、binlog_rows_query_log_events=ON
の環境化ではオリジナルSQLを表示します。
binlog_row_imageオプション
続いて、binlog_row_image
オプションです。バイナリログに記録する行の更新イメージを指定するオプションです。MySQL5.6とそれ以降からのオプションであり、オンラインで設定変更可能です。
以下の3つの値から設定できます。
- full
- 更新前と後のすべてのカラム情報を記録(デフォルト)
- minimal
- 更新するカラム情報とその行を識別できるカラムのみ記録
- noblob
- 更新対象ではないtext/blob型は除外した、更新前と後のすべてのカラム情報を記録
例として、疑似SQLからfull
とminimal
の違いを見てみましょう。
以下のようなテーブルを作成して、UPDATE t1 SET col1=10 WHERE id=1;
というUPDATE文を実行してみます。
full
は変更前と変更後のすべてのカラムのデータが記録されますが、minimal
は更新するカラム(col1)とその行を特定するためのプライマリキーであるカラム(id)の情報のみを記録します。
minimal
にすることのメリットとして、バイナリログのディスク量の削減、バイナリログのキャッシュ量(メモリ)の削減やスレーブ転送のネットワーク量の削減ができます。ただし、識別できるカラム(プライマリーキーやNOT NULLなユニークキー)が存在しない場合は、更新前の情報にすべてのカラムを記録するようになります。
基本はすべてのテーブルにプライマリキーがあるはずだと思うので、minimal
に設定することでRBRの最適化ができます。
まとめ
MySQL5.7以降ではRBRがデフォルトの設定になっています。InnoDB ClusterにおいてもRBRが必須の条件となっているように、SBRでの運用は今後なくなっていくと思われます。RBRに関するオプションを理解して、障害や問題を対処できるようにしておきましょう。