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


13.4.2.2 CHANGE REPLICATION FILTER ステートメント

CHANGE REPLICATION FILTER filter[, filter]
	[, ...] [FOR CHANNEL channel]

filter: {
    REPLICATE_DO_DB = (db_list)
  | REPLICATE_IGNORE_DB = (db_list)
  | REPLICATE_DO_TABLE = (tbl_list)
  | REPLICATE_IGNORE_TABLE = (tbl_list)
  | REPLICATE_WILD_DO_TABLE = (wild_tbl_list)
  | REPLICATE_WILD_IGNORE_TABLE = (wild_tbl_list)
  | REPLICATE_REWRITE_DB = (db_pair_list)
}

db_list:
    db_name[, db_name][, ...]

tbl_list:
    db_name.table_name[, db_name.table_name][, ...]
wild_tbl_list:
    'db_pattern.table_pattern'[, 'db_pattern.table_pattern'][, ...]

db_pair_list:
    (db_pair)[, (db_pair)][, ...]

db_pair:
    from_db, to_db

CHANGE REPLICATION FILTER は、--replicate-do-db--replicate-wild-ignore-table などのレプリケーションフィルタリングオプションを使用してレプリカ mysqld を起動するのと同じ方法で、レプリカに 1 つ以上のレプリケーションフィルタリングルールを設定します。 サーバーオプションとは異なり、このステートメントを有効にするためにサーバーを再起動する必要はなく、まず STOP REPLICA | SLAVE SQL_THREAD を使用してレプリケーション SQL スレッドを停止します (その後、START REPLICA | SLAVE SQL_THREAD を使用して再起動します)。 CHANGE REPLICATION FILTER には、REPLICATION_SLAVE_ADMIN 権限 (または非推奨の SUPER 権限) が必要です。 FOR CHANNEL channel 句を使用すると、レプリケーションフィルタをマルチソースレプリカなどのレプリケーションチャネルに固有にできます。 特定の FOR CHANNEL 句なしで適用されたフィルタはグローバルフィルタとみなされ、すべてのレプリケーションチャネルに適用されます。

注記

グループレプリケーション用に構成された MySQL サーバーインスタンスでは、グローバルレプリケーションフィルタを設定できません。これは、一部のサーバーでトランザクションをフィルタすると、グループが一貫性のある状態で承諾に到達できなくなるためです。 グループメンバーがグループ外のソースへのレプリカとしても機能する場合など、グループレプリケーションに直接関与しないレプリケーションチャネルにチャネル固有のレプリケーションフィルタを設定できます。 group_replication_applier または group_replication_recovery チャネルでは設定できません。

次のリストに、CHANGE REPLICATION FILTER のオプションと、それらが --replicate-* サーバーのオプションとどのように関連しているかを示します:

  • REPLICATE_DO_DB: データベース名に基づいた更新を含めます。 --replicate-do-db と同等です。

  • REPLICATE_IGNORE_DB: データベース名に基づいて更新を除外します。 --replicate-ignore-db と同等です。

  • REPLICATE_DO_TABLE: テーブル名に基づく更新を含めます。 --replicate-do-table と同等です。

  • REPLICATE_IGNORE_TABLE: テーブル名に基づいて更新を除外します。 --replicate-ignore-table と同等です。

  • REPLICATE_WILD_DO_TABLE: ワイルドカードパターンマッチングテーブル名に基づく更新を含めます。 --replicate-wild-do-table と同等です。

  • REPLICATE_WILD_IGNORE_TABLE: ワイルドカードパターンマッチングテーブル名に基づいて更新を除外します。 --replicate-wild-ignore-table と同等です。

  • REPLICATE_REWRITE_DB: レプリカ上の新しい名前をソース上の指定されたデータベースに置き換えた後、レプリカで更新を実行します。 --replicate-rewrite-db と同等です。

REPLICATE_DO_DB および REPLICATE_IGNORE_DB フィルタの正確な影響は、ステートメントベースレプリケーションと行ベースレプリケーションのどちらが有効かによって異なります。 詳しくはセクション17.2.5「サーバーがレプリケーションフィルタリングルールをどのように評価するか」,をご覧ください。

次に示すように、ルールをカンマで区切ることで、単一の CHANGE REPLICATION FILTER ステートメントに複数のレプリケーションフィルタリングルールを作成できます:

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (d1), REPLICATE_IGNORE_DB = (d2);

前述のステートメントを発行することは、--replicate-do-db=d1 --replicate-ignore-db=d2 オプションを指定してレプリカ mysqld を起動することと同じです。

複数のレプリケーションチャネルを使用して異なるソースからのトランザクションを処理するマルチソースレプリカでは、FOR CHANNEL channel 句を使用してレプリケーションチャネルにレプリケーションフィルタを設定します:

CHANGE REPLICATION FILTER REPLICATE_DO_DB = (d1) FOR CHANNEL channel_1;

これにより、チャネル固有のレプリケーションフィルタを作成して、選択したデータをソースから除外できます。 FOR CHANNEL 句が指定されている場合、レプリケーションフィルタステートメントはそのレプリケーションチャネルで動作し、指定されたレプリケーションフィルタと同じフィルタタイプを持つ既存のレプリケーションフィルタを削除して、指定されたフィルタに置き換えます。 ステートメントに明示的にリストされていないフィルタタイプは変更されません。 構成されていないレプリケーションチャネルに対して発行された場合、ステートメントは ER_SLAVE_CONFIGURATION エラーで失敗します。 グループレプリケーションチャネルに対して発行すると、ステートメントは ER_SLAVE_CHANNEL_OPERATION_NOT_ALLOWED エラーで失敗します。

複数のレプリケーションチャネルが構成されているレプリカでは、FOR CHANNEL 句を指定せずに CHANGE REPLICATION FILTER を発行すると、構成されているすべてのレプリケーションチャネルおよびグローバルレプリケーションフィルタに対してレプリケーションフィルタが構成されます。 すべてのフィルタタイプについて、フィルタタイプがステートメントにリストされている場合、そのタイプの既存のフィルタルールは、最後に発行されたステートメントで指定されたフィルタルールに置き換えられます。それ以外の場合は、フィルタタイプの古い値が保持されます。 詳細は、セクション17.2.5.4「レプリケーションチャネルベースのフィルタ」 を参照してください。

同じフィルタリングルールが複数回指定されている場合、実際には last のそのようなルールのみが使用されます。 たとえば、最初のステートメントの最初の REPLICATE_DO_DB ルールは無視されるため、ここに示す 2 つのステートメントはまったく同じ効果があります:

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (db1, db2), REPLICATE_DO_DB = (db3, db4);

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (db3, db4);
注意

この動作は、同じオプションを複数回指定すると複数のフィルタルールが作成される --replicate-* フィルタオプションとは異なります。

特殊文字を含まないテーブルおよびデータベースの名前は引用符で囲む必要はありません。 REPLICATION_WILD_TABLE および REPLICATION_WILD_IGNORE_TABLE で使用される値は文字列式で、(特殊な) ワイルドカード文字が含まれている可能性があるため、引用符で囲む必要があります。 これを次のステートメントの例に示します:

CHANGE REPLICATION FILTER
    REPLICATE_WILD_DO_TABLE = ('db1.old%');

CHANGE REPLICATION FILTER
    REPLICATE_WILD_IGNORE_TABLE = ('db1.new%', 'db2.new%');

REPLICATE_REWRITE_DB で使用される値は、データベース名のペアを表します。このような値はそれぞれカッコで囲む必要があります。 次のステートメントは、ソースのデータベース db1 で発生したステートメントをレプリカのデータベース db2 にリライトします:

CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB = ((db1, db2));

前述のステートメントには、データベース名のペアを囲むカッコと、リスト全体を囲むカッコの 2 つのセットが含まれています。 これは、データベース dbAdbB にリライトし、データベース dbCdbD にリライトするという 2 つの rewrite-db ルールを作成する次の例では、より簡単に見られます:

CHANGE REPLICATION FILTER
  REPLICATE_REWRITE_DB = ((dbA, dbB), (dbC, dbD));

CHANGE REPLICATION FILTER ステートメントでは、ステートメントの影響を受けるフィルタタイプおよびレプリケーションチャネルのレプリケーションフィルタリングルールのみが置換され、他のルールおよびチャネルは変更されません。 特定のタイプのすべてのフィルタの設定を解除する場合は、次の例に示すように、フィルタ値を明示的に空のリストに設定します。これにより、既存のすべての REPLICATE_DO_DB および REPLICATE_IGNORE_DB ルールが削除されます:

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();

この方法でフィルタを空に設定すると、既存のすべてのルールが削除され、新しいルールは作成されず、mysqld の起動時にコマンド行または構成ファイルで --replicate-* オプションを使用して設定されたルールは復元されません。

RESET REPLICA | SLAVE ALL ステートメントは、ステートメントによって削除されたチャネルに設定されたチャネル固有のレプリケーションフィルタを削除します。 削除されたチャネルが再作成されると、レプリカに指定されたグローバルレプリケーションフィルタがそれらにコピーされ、チャネル固有のレプリケーションフィルタは適用されません。

詳細は、セクション17.2.5「サーバーがレプリケーションフィルタリングルールをどのように評価するか」を参照してください。


関連キーワード:  ステートメント, TABLE, REPLICATE, CREATE, フィルタ, REPLICATION, FILTER, ルール, チャネル, DROP