Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

MySQL-5.6.5の新機能「GTID」を使う際に抑えておきたい落とし穴

GTIDというと、MySQL-MHA無しでもフェイルオーバーできる素晴らしい機能だというのが一般的な認識ではないでしょうか。

私もそう思っていました。
しかしよくよく調べてみると、色々な制約があるようです。

Master-Slave構成に関わるすべてのマシンでGTIDを有効にする必要がある

MySQL-5.0系からMySQL-5.6系への移行を行うと同時にGTIDを有効化する事は出来ません。

使えるストレージエンジンが限られる

とも言われているように、対応しているのは、実質InnoDBのみとなります。
MyISAMやMemoryといったストレージエンジンがあるとGTIDが使えません。

なぜなら、GTIDとは、マスタのbinlogファイル名トポジション管理の代わりに、トランザクションにID(GTID)を持たせることでレプリケーションの進行具合を管理するものです。
それであるが故に、トランザクションが使えるストレージエンジンに限定されるのです。

とは言っても、MyISAMテーブル残したままGTIDを導入したいと考える方もいらっしゃると思います。
その場合には強制的に使う方法も用意されております。
my.cnfDISABLE_GTID_UNSAFE_STATEMENTS = 0と記述しましょう。

その他の制約

以下の記事によくまとまっています。

Global Transaction IDを使ってレプリケーション構成とした際の制限
http://d.hatena.ne.jp/hiroi10/20121105/1352134310 Global Transaction IDを有効にしてレプリケーション構成とした際の制限について簡単にまとめてみる。微妙な訳になっている部分もあるだろうし、勘違いしてる箇所もあるかもしれないのでご注意下さい。 よって、アレ?、というのがありましたら基本的には公式ドキュメントを参照して下さい。 むしろ誤りあったら突っ込んでもらえると助かります。

見出しとエラーメッセージを引用させて頂きます。
以下いずれも、DISABLE_GTID_UNSAFE_STATEMENTS=0にすることでエラーを抑制できます。
しかし、使いどころには注意しましょう。

トランザクションが使えないストレージエンジンは使用出来ない(MyISAM等)

ERROR 1785 (HY000): Updates to non-transactional tables are forbidden when DISABLE_GTID_UNSAFE_STATEMENTS = 1.

MasterとSlaveで同一テーブルで異なるストレージエンジンは使用してはいけない

MasterとSlaveで異なるbinlog_formatは使用してはいけない?

Last_Errno: 1785
Last_Error: Error 'Updates to non-transactional tables are forbidden when DISABLE_GTID_UNSAFE_STATEMENTS = 1.' on query. Default database: 'test'. Query: 'insert into test values ()'`

CREATE TABLE ... SELECT はサポートされない(使用出来ない)

ERROR 1786 (HY000): CREATE TABLE ... SELECT is forbidden when DISABLE_GTID_UNSAFE_STATEMENTS = 1.

トランザクション内ではCREATE TEMPORARY TABLE と DROP TEMPORARY TABLEはサポートされない

ERROR 1787 (HY000): When DISABLE_GTID_UNSAFE_STATEMENTS = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1.