GTIDというと、MySQL-MHA無しでもフェイルオーバーできる素晴らしい機能だというのが一般的な認識ではないでしょうか。
私もそう思っていました。
しかしよくよく調べてみると、色々な制約があるようです。
Master-Slave構成に関わるすべてのマシンでGTIDを有効にする必要がある
MySQL-5.0系からMySQL-5.6系への移行を行うと同時にGTIDを有効化する事は出来ません。
使えるストレージエンジンが限られる
そしてGTID投入の結構な障壁なのがサービス用DBでMyISAMが使えなくなることってのが割とあったり。まだケースによって使われてるんですよねぇ、MyISAM
— ITOH Hiroyukiさん (@i_rethi) 2013年5月9日
とも言われているように、対応しているのは、実質InnoDBのみとなります。
MyISAMやMemoryといったストレージエンジンがあるとGTIDが使えません。
なぜなら、GTIDとは、マスタのbinlogファイル名トポジション管理の代わりに、トランザクションにID(GTID)を持たせることでレプリケーションの進行具合を管理するものです。
それであるが故に、トランザクションが使えるストレージエンジンに限定されるのです。
とは言っても、MyISAMテーブル残したままGTIDを導入したいと考える方もいらっしゃると思います。
その場合には強制的に使う方法も用意されております。
my.cnf
にDISABLE_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.
PlanetMySQL Voting: Vote UP / Vote DOWN