GTID ベースレプリケーションはトランザクションに依存しているため、そうでなければ MySQL で使用できるいくつかの機能が、それを使用するときにサポートされません。このセクションでは、GTID ベースレプリケーションの制約と制限についての情報を提供します。
非トランザクションストレージエンジンに関係する更新
GTID を使用する場合、MyISAM
などの非トランザクションストレージエンジンを使用するテーブルへの更新は、InnoDB
などのトランザクションストレージエンジンを使用するテーブルへの更新と同じステートメントまたはトランザクションで実行できません。
この制約は、非トランザクションストレージエンジンを使用するテーブルへの更新とトランザクションストレージエンジンを使用するテーブルへの更新が、同じトランザクション内に混在していると、複数の GTID が同じトランザクションに割り当てられる可能性があるためです。
このような問題は、マスターとスレーブが異なるストレージエンジンをそれぞれのバージョンの同じテーブルに使用するときにも発生する可能性があります (一方のストレージエンジンはトランザクション、他方はそうではない)。
今挙げたいずれの場合も、トランザクションと GTID との間の 1 対 1 対応が壊れていて、GTID ベースレプリケーションは正しく機能できません。
CREATE TABLE ... SELECT ステートメント
CREATE TABLE ... SELECT
はステートメントベースレプリケーションには安全ではありません。行ベースレプリケーションを使用する場合、このステートメントのログは実際には 2 つの異なるイベントとして記録されます。1 つはテーブルを作成するためのもの、他方はソーステーブルから作成されたばかりの新しいテーブルに行を挿入するためのものです。このステートメントがトランザクション内で実行されると、同じトランザクション識別子を受け取るこれらの 2 つのイベントにいくつかのケースが可能であり、これは挿入を含むトランザクションがスレーブによってスキップされることを意味します。このため、GTID ベースレプリケーションを使用する場合は、CREATE TABLE ... SELECT
はサポートされません。
一時テーブル
CREATE TEMPORARY TABLE
および DROP TEMPORARY TABLE
ステートメントは、GTID を使用するとき (つまり、サーバーが --enforce-gtid-consistency
オプションで起動されたとき) に、トランザクション内でサポートされません。GTID を有効にした状態でこれらのステートメントを使用することは可能です (ただし、トランザクションの外側のみ、および autocommit=1
のときのみ)。
サポートされないステートメントの実行の回避
GTID ベースレプリケーションが失敗するステートメントの実行を回避するために、GTID を有効にするときは、すべてのサーバーが --enforce-gtid-consistency
オプションで起動される必要があります。これにより、このセクションですでに説明したタイプのステートメントはエラーで失敗します。
GTID を有効にするときに必要なほかの起動オプションについては、セクション17.1.3.2「GTID を使用したレプリケーションのセットアップ」を参照してください。
GTID を使用するときに、sql_slave_skip_counter
はサポートされません。トランザクションをスキップする必要がある場合は、代わりにマスターの gtid_executed
変数を使用してください。詳細については、空のトランザクションの注入を参照してください。
GTID モードと mysqldump MySQL 5.6.9 以降では、ターゲットサーバーのバイナリログに GTID がないこと場合に、mysqldump を使用して作成されたダンプを GTID モードが有効な状態で動作する MySQL Server にインポートできます。
MySQL 5.6.9 より前では、mysqldump はグローバルトランザクション ID を記録せず、GTID をリストアするためにバイナリログと mysqlbinlog を使用する必要がありました。(Bug #14797808、Bug #14832472)
GTID モードと mysql_upgrade
MySQL 5.6.7 より前では、mysql_upgrade が --write-binlog=OFF
で実行されないかぎり、mysql_upgrade は --gtid-mode=ON
で動作する MySQL Server に接続できませんでした。(そうでない場合は、mysqld は、mysql_upgrade を実行する前に --gtid-mode=OFF
で再起動されてから、あとで --gtid_mode=ON
で再起動される必要がありました。)これは MySQL 5.6.7 以降では問題ではなく、mysql_upgrade はデフォルトで --write-binlog=OFF
で動作します。(Bug #13833710) ただし、そのようにすることは推奨されません。mysql_upgrade が MyISAM
ストレージエンジン (非トランザクション) を使用するシステムテーブルに変更を加えることができるためです。