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


17.5.1.31 レプリケーションと一時テーブル

MySQL 8.0 では、binlog_formatROW または MIXED に設定されている場合、一時テーブルのみを使用するステートメントはソースに記録されないため、一時テーブルはレプリケートされません。 一時テーブルと非一時テーブルが混在するステートメントは、非一時テーブルに対する操作に対してのみソースに記録され、一時テーブルに対する操作は記録されません。 これは、レプリカによって計画外停止が行われた場合に失われるレプリカ上の一時テーブルがないことを意味します。 行ベースレプリケーションと一時テーブルの詳細は、一時テーブルの行ベースロギングを参照してください。

binlog_formatSTATEMENT に設定されている場合、一時テーブルに関連するステートメントをステートメントベースの形式を使用して安全にログに記録できるかぎり、一時テーブルに対する操作はソースに記録され、レプリカにレプリケートされます。 この状況では、レプリカ上のレプリケートされた一時テーブルの損失が問題になる可能性があります。 ステートメントベースレプリケーションモードでは、GTID がサーバー上で使用されている場合 (つまり、enforce_gtid_consistency システム変数が ON に設定されている場合)、CREATE TEMPORARY TABLE および DROP TEMPORARY TABLE ステートメントをトランザクション、手順、関数、またはトリガー内で使用することはできません。 GTID が使用されている場合、autocommit=1 が設定されていれば、これらのコンテキストの外部で使用できます。

一時テーブルに関して行ベースまたは混合レプリケーションモードとステートメントベースのレプリケーションモードの動作が異なるため、変更がオープン一時テーブルを含むコンテキスト (グローバルまたはセッション) に適用される場合、実行時にレプリケーション形式を切り替えることはできません。 詳細は、binlog_format オプションの説明を参照してください。

一時テーブル使用時の安全なレプリカの停止.  ステートメントベースレプリケーションモードでは、(レプリケーションスレッドだけでなく) 複製サーバーを停止し、まだ複製で実行されていない更新で使用するために開かれている複製一時テーブルがある場合を除き、一時テーブルは複製されます。 レプリカサーバーを停止すると、レプリカの再起動時に、これらの更新に必要な一時テーブルを使用できなくなります。 この問題を回避するには、一時テーブルが開いている間はレプリカを停止しないでください。 代わりに、次の手順を使用してください。

  1. STOP REPLICA | SLAVE SQL_THREAD ステートメントを発行します。

  2. SHOW STATUS を使用して Slave_open_temp_tables 変数の値を確認します。

  3. 値が 0 でない場合は、START REPLICA | SLAVE SQL_THREAD を使用してレプリケーション SQL スレッドを再起動し、後で手順を繰り返します。

  4. 値が 0 の場合は、mysqladmin shutdown コマンドを発行してレプリカを停止します。

一時テーブルとレプリケーションオプション.  デフォルトでは、ステートメントベースレプリケーションでは、すべての一時テーブルがレプリケートされます。これは、一致する --replicate-do-db--replicate-do-table、または --replicate-wild-do-table オプションが有効になっているかどうかにかかわらず発生します。 ただし、--replicate-ignore-table および --replicate-wild-ignore-table オプションは一時テーブルで受け付けられます。 ただし、セッションの終了時に一時テーブルを正しく削除できるようにするために、レプリカは、通常は指定されたテーブルに適用される除外ルールに関係なく、常に DROP TEMPORARY TABLE IF EXISTS ステートメントをレプリケートします。

ステートメントベースレプリケーションを使用するときに推奨される方法は、レプリケートしない一時テーブルの名前付けに排他的に使用する接頭辞を指定し、その接頭辞と一致するように --replicate-wild-ignore-table オプションを使用することです。 たとえば、このようなすべてのテーブルに norep で始まる名前を付けてから (たとえば、norepmytablenorepyourtable など)、テーブルが複製されることを回避するために --replicate-wild-ignore-table=norep% を使用します。


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