システム変数は、次の変数を除き (セッションスコープで使用されるとき)、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.2.4.3「混合形式のバイナリロギング形式」を参照してください。
NO_DIR_IN_CREATE
モードの場合を除いて、sql_mode
も複製されます。スレーブは常に、NO_DIR_IN_CREATE
にその独自の値を保持します (マスター上での変更にかかわらず)。これは、すべてのレプリケーション形式に当てはまります。
ただし、mysqlbinlog が SET @@sql_mode =
ステートメントを解析したときに、mode
NO_DIR_IN_CREATE
を含む完全な mode
値が受信サーバーに渡されます。このため、このようなステートメントのレプリケーションは、STATEMENT
モード使用時は安全でない場合があります。
default_storage_engine
および storage_engine
のシステム変数は、ロギングモードにかかわらず複製されません。これは、異なるストレージエンジン間のレプリケーションを容易にすることを意図しています。
read_only
システム変数は複製されません。さらに、この変数を有効にした場合の一時テーブル、テーブルロック、および SET PASSWORD
ステートメントに関する効果は、MySQL バージョンごとに異なります。
max_heap_table_size
システム変数は複製されません。スレーブ上でこの変数の値を増やさずにマスター上で増やすと、最終的にスレーブ上でTable is fullエラーになる可能性があります (スレーブの対応するものより大きくなることが許可されたマスター上のMEMORY
テーブルで INSERT
ステートメントを実行しようとするとき)。詳細については、セクション17.4.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.1.2「レプリケーション形式」を参照してください。
MySQL 5.6 では、次のセッション変数はロギング形式にかかわらず、バイナリログに書き込まれ、バイナリログを解析するときにレプリケーションスレーブによって受け付けられます。
sql_mode
foreign_key_checks
unique_checks
character_set_client
collation_connection
collation_database
collation_server
sql_auto_is_null
文字セットと照合順序に関係するセッション変数はバイナリログに書き込まれるけれども、異なる文字セット間のレプリケーションはサポートされません。
混乱の可能性を減らすため、マスターとスレーブの両方で lower_case_table_names
システム変数に常に同じ設定を使用することをお勧めします (特に、ファイルシステムが大文字小文字を区別するプラットフォームで MySQL を実行しているとき)。
以前のバージョンの MySQL で、大文字小文字を区別するファイルシステムが使用されているとき、この変数をスレーブで 1 に、マスターで異なる値に設定すると、レプリケーションが失敗することがありました。この問題は MySQL 5.6.1 で解決されています。(Bug #37656)