MySQLのレプリケーション形式には、
SBRはマスターで実行されたDMLをそのままバイナリログに書き込み、
SBRとRBRについて
まず、
mysql> UPDATE t SET id=4 ; Query OK, 2 row affected (0.00 sec) Rows matched: 2 Changed: 2 Warnings: 0
このUPDATE文は2行のデータが更新されました。このとき、UPDATE t SET id=4;
の文がそのままバイナリログに保存されてスレーブで実行されます。マスターのバイナリログを見ると、
#161117 14:51:53 server id 1 end_log_pos 282 CRC32 0x15364852 Query thread_id=3 exec_time=0 error_code=0 use `aa`/*!*/; SET TIMESTAMP=1479361913/*!*/; update t set id=4
RBRは変更された2行の内容をバイナリログに保存し、
また、mysqlbinlog
コマンドに--verbose
オプションをつけることで表示されるもので、
今回は2行の更新があったので、
#161117 14:53:07 server id 1 end_log_pos 288 CRC32 0xb7c296bb Update_rows: table id 71 flags: STMT_END_F BINLOG ' 40wtWBMBAAAAKgAAAOgAAAAAAEcAAAAAAAEAAmFhAAF0AAEDAAHYgKdx 40wtWB8BAAAAOAAAACABAAAAAEcAAAAAAAEAAgAB///+BgAAAP4EAAAA/gYAAAD+BAAAAI57bt8= '/*!*/; ### UPDATE `aa`.`t` ### WHERE ### @1=6 ### SET ### @1=4 ### UPDATE `aa`.`t` ### WHERE ### @1=6 ### SET ### @1=4
また、binlog_
を使用することで、
SBRやRBRはパラメータbinlog_
で設定が可能です。デフォルトはMySQL5.STATEMENT
ROW
MySQLバージョン | binlog_ |
---|---|
MySQL5. |
STATEMENT |
MySQL5. |
ROW |
SBRとRBRを混合したMIXED
という設定も可能です。この設定値は基本的にはSBRですが、
RBRの遅延について
前置きが少し長くなりましたが、
レプリケーション遅延の発生
binlog_ROW
で運用しているMySQLがあったとします。
CREATE TABLE temp_table ( tmp_id int);
このようなテーブルを作成しました。このテーブルはバッチ処理用の仮テーブルのため、
DELETE FROM temp_table LIMIT 100000; Query OK, 100000 row affected (0.82 sec) Rows matched: 100000 Changed: 100000 Warnings: 0
マスターでは1秒以内でこの文は完了し、
レプリケーション遅延の原因
今回は以下の要因により遅延が発生しました。
- プライマリキーやインデックスを作成していないため毎行削除のためにテーブルフルスキャン
インデックスを作成していないテーブルなので、
レプリケーション遅延の解決
いくつかの解決方法があります。
- プライマリーキーまたはインデックスを作成する
- パラメータ
slave_
を変更をするrows_ search_ algorithms
はじめに、
次に、slave_
を変更することで、TABLE_
で、
これをINDEX_
に変更することで、binlog-row-event-max-size
が大きいときです。このパラメータはRBRにおいてバイナリログに記述する行情報の最大サイズを指定します。そのため、
前述のとおり、MIXED
でもRBRに切り替わることがあるので同様の事象は発生します。MIXED
は単純なDELETE文であればSBRで処理されますが、
まとめ
RBRを行う場合は、