Open1

MySQLでreplicaにだけtriggerを有効にできるか

catatsuycatatsuy

https://dev.mysql.com/doc/refman/8.0/en/replication-features-triggers.html

replicaにだけtriggerを有効にする場合はstatement-based replicationである必要がある。ドキュメントを読む限り、特に直す気はなさそう。

MariaDBは設定で有効にすることでrow-based replicationでも利用できる。

https://mariadb.com/kb/en/running-triggers-on-the-replica-for-row-based-events/

問題はbinlog_formatがなくなる予定で、row-based replicationに統一される予定であること。

https://twitter.com/tmtms/status/1648835402088992768

元々正確性を担保できないstatement-based replicationは最近は避ける傾向が強まっていたので、予期できる展開ではあった。

以前はcharacter setをutf8mb3からutf8mb4に変更するために、事前にreplicaでALTER TABLEしてutf8mb4にしておき、statement-based replicationを利用することでsourceがutf8mb3でreplicaがutf8mb4と食い違っていてもreplicationが続くことを活用する手法があった。

しかしMySQL 8.0.14からこのALTER TABLEはINPLACEになった。ALTER TABLEがINPLACEになる範囲は少しずつ広がっているので、現在では必要性は低い。

それとドキュメントにも書かれているこのバグを個人的にも踏んだことがあるので、MySQL Triggerをstatement-based replicationで利用するのは結構恐い。

A statement invoking a trigger (or function) that causes an update to an AUTO_INCREMENT column is not replicated correctly using statement-based replication. MySQL 8.0 marks such statements as unsafe. (Bug #45677)