MySQL 8.0 リファレンスマニュアル


17.5.1.39 レプリケーションと変数

システム変数は、次の変数を除き (セッションスコープで使用されるとき)、STATEMENT モード使用時は正しく複製されません。

  • auto_increment_increment

  • auto_increment_offset

  • character_set_client

  • character_set_connection

  • character_set_database

  • character_set_server

  • collation_connection

  • collation_database

  • collation_server

  • foreign_key_checks

  • identity

  • last_insert_id

  • lc_time_names

  • pseudo_thread_id

  • sql_auto_is_null

  • time_zone

  • timestamp

  • unique_checks

MIXED モード使用時に、前述のリスト内の変数がセッションスコープで使用されるときはステートメントベースから行ベースロギングに切り替わります。 セクション5.4.4.3「混合形式のバイナリロギング形式」を参照してください。

sql_modeNO_DIR_IN_CREATE モードを除いてレプリケートされます。レプリカは、ソースでの変更に関係なく、常に NO_DIR_IN_CREATE の独自の値を保持します。 これは、すべてのレプリケーション形式に当てはまります。

ただし、mysqlbinlogSET @@sql_mode = mode ステートメントを解析したときに、NO_DIR_IN_CREATEを含む完全な mode 値が受信サーバーに渡されます。 このため、このようなステートメントのレプリケーションは、STATEMENT モード使用時は安全でない場合があります。

ロギングモードに関係なく、default_storage_engine システム変数はレプリケートされません。これは、異なるストレージエンジン間のレプリケーションを容易にすることを目的としています。

read_only システム変数は複製されません。 さらに、この変数を有効にした場合の一時テーブル、テーブルロック、および SET PASSWORD ステートメントに関する効果は、MySQL バージョンごとに異なります。

max_heap_table_size システム変数は複製されません。 レプリカでこれを行わずにソースでこの変数の値を増やすと、ソース上の MEMORY テーブルで INSERT ステートメントを実行しようとしたときに、最終的にレプリカで「テーブルがいっぱいです」エラーが発生する可能性があるため、レプリカ上の対応する値より大きくなることが許可されます。 詳細については、セクション17.5.1.21「レプリケーションと MEMORY テーブル」を参照してください。

ステートメントベースレプリケーションで、セッション変数は、テーブルを更新するステートメントで使用されるときに正しく複製されません。 たとえば、次の一連のステートメントでは、ソースとレプリカに同じデータは挿入されません:

SET max_join_size=1000;
INSERT INTO mytable VALUES(@@max_join_size);

これは、一般的なシーケンスには適用されません。

SET time_zone=...;
INSERT INTO mytable VALUES(CONVERT_TZ(..., ..., @@time_zone));

セッション変数のレプリケーションは、行ベースレプリケーションが使用されているときは問題ではありません。このケースでは、セッション変数は常に安全に複製されます。 セクション17.2.1「レプリケーション形式」を参照してください。

次のセッション変数はバイナリログに書き込まれ、ロギング形式に関係なく、バイナリログの解析時にレプリカによって適用されます:

  • sql_mode

  • foreign_key_checks

  • unique_checks

  • character_set_client

  • collation_connection

  • collation_database

  • collation_server

  • sql_auto_is_null

重要

文字セットと照合順序に関係するセッション変数はバイナリログに書き込まれるけれども、異なる文字セット間のレプリケーションはサポートされません。

混乱の可能性を低減するために、特にファイルシステムが大/小文字を区別するプラットフォームで MySQL を実行している場合は、ソースとレプリカの両方で lower_case_table_names システム変数に常に同じ設定を使用することをお薦めします。 lower_case_table_names 設定は、サーバーの初期化時にのみ構成できます。


関連キーワード:  変数, ソース, ステートメント, バイナリ, ベース, テーブル, GTID, 構成, 設定, トランザクション