MySQL binlog_format とバイナリロギング、レプリケーションについて
少し雑なメモです。
MySQL で binlog を記録するかどうかについて。
master で binlog を書き込まなければ、レプリケーションもされません。
--binlog-do-db (master 側) や --replicate-do-db (slave 側) のようなオプションは運用従事者ならご存知の方も多いと思いますが、master の binlog_format によっても、binlog に書き込むか否かに差異があります。
MySQL 5.6 の場合、↓のページでフローチャートに表されています。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 17.2.3.1 データベースレベルレプリケーションオプションおよびバイナリロギングオプションの評価
TL;DR
binlog に記録するか否か。
(※ "◯" と付いている場合、実際には --binlog-do-db や --replicate-do-db などの評価に進む)
| binlog_format | 対象の DB を Use している | 実際に変更が有る |
|---|---|---|
| STATEMENT,MIXED | ◯ | - |
| ROW | - | ◯ |
つまり、
STATEMENT, MIXEDのときは、対象 DB を Use していないとバイナリログに記録されず、レプリケーションもされません。ROWのときは、対象 DB を Use してようがしていまいが、実際に更新される行があればバイナリログに記録され、レプリケーションもされます。
※ --binlog-do-db, --replicate-do-db などのオプションが全くない場合
binlog_format=MIXED については、上のページでは述べられていませんが、手元の MySQL(5.6系)で試したところ、 STATEMENT と同じ挙動でした。