Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

17.2.5.4 レプリケーションチャネルベースのフィルタ

このセクションでは、マルチソースレプリケーショントポロジなどに複数のレプリケーションチャネルが存在する場合にレプリケーションフィルタを使用する方法について説明します。 MySQL 8.0 より前は、レプリケーションフィルタはグローバルであったため、すべてのレプリケーションチャネルにフィルタが適用されていました。 MySQL 8.0 からは、レプリケーションフィルタをグローバルまたはチャネル固有にでき、特定のレプリケーションチャネルでレプリケーションフィルタを使用してマルチソースレプリカを構成できます。 チャネル固有のレプリケーションフィルタは、同じデータベースまたはテーブルが複数のソースに存在し、レプリカが単一のソースからレプリケートする必要がある場合に、マルチソースレプリケーショントポロジで特に役立ちます。

レプリケーションチャネルの設定手順は、セクション17.1.5「MySQL マルチソースレプリケーション」 を参照してください。レプリケーションチャネルの動作の詳細は、セクション17.2.2「レプリケーションチャネル」 を参照してください。

重要

マルチソースレプリカ上の各チャネルは、異なるソースからレプリケートする必要があります。 レプリケーションフィルタを使用してチャネルごとにレプリケートする異なるデータを選択した場合でも、単一のレプリカから単一のソースに複数のレプリケーションチャネルを設定することはできません。 これは、レプリカのサーバー ID がレプリケーショントポロジ内で一意である必要があるためです。 ソースはレプリカをサーバー ID でのみ区別し、レプリケーションチャネルの名前では区別しないため、同じレプリカとは異なるレプリケーションチャネルを認識できません。

重要

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

重要

ダイヤモンドトポロジ内のマルチソースレプリカ (レプリカが複数のソースからレプリケートされ、共通ソースからレプリケートされる) の場合、GTID ベースのレプリケーションが使用されているときは、マルチソースレプリカ上のすべてのチャネルでレプリケーションフィルタまたはその他のチャネル構成が同一であることを確認してください。 GTID ベースのレプリケーションでは、フィルタはトランザクションデータにのみ適用され、GTID はフィルタで除外されません。 これは、レプリカの GTID セットがソースと一貫性が保たれるようにするためです。つまり、毎回フィルタで除外されたトランザクションを再取得せずに GTID 自動配置を使用できます。 ダウンストリームレプリカがマルチソースで、ダイアモンドトポロジの複数のソースから同じトランザクションを受信する場合、ダウンストリームレプリカには複数のバージョンのトランザクションが含まれるようになり、結果はトランザクションを最初に適用するチャネルによって異なります。 トランザクションの GTID が最初のチャネルによって gtid_executed セットに追加されたため、GTID 自動スキップを使用してトランザクションをスキップしようとする 2 つ目のチャネル。 チャネルのフィルタリングが同一の場合、トランザクションのすべてのバージョンに同じデータが含まれているため、結果は同じであるため、問題はありません。 ただし、チャネルのフィルタリングが異なると、データベースに一貫性がなくなる可能性があり、レプリケーションがハングする可能性があります。

レプリケーションフィルタおよびチャネルの概要

マルチソースレプリケーショントポロジなどに複数のレプリケーションチャネルが存在する場合、レプリケーションフィルタは次のように適用されます:

  • 指定したグローバルレプリケーションフィルタは、フィルタタイプ (do_dbdo_ignore_table など) のグローバルレプリケーションフィルタに追加されます。

  • チャネル固有のレプリケーションフィルタは、指定されたフィルタタイプの指定されたチャネルのレプリケーションフィルタにフィルタを追加します。

  • このタイプのチャネル固有のレプリケーションフィルタが構成されていない場合、各レプリケーションチャネルはグローバルレプリケーションフィルタをチャネル固有のレプリケーションフィルタにコピーします。

  • 各チャネルは、チャネル固有のレプリケーションフィルタを使用してレプリケーションストリームをフィルタリングします。

チャネル固有のレプリケーションフィルタを作成する構文は、既存の SQL ステートメントおよびコマンドオプションを拡張します。 レプリケーションチャネルが指定されていない場合、グローバルレプリケーションフィルタは下位互換性を保証するように構成されます。 CHANGE REPLICATION FILTER ステートメントでは、チャネル固有のフィルタをオンラインで構成する FOR CHANNEL 句がサポートされています。 フィルタを構成するための --replicate-* コマンドオプションでは、--replicate-filter_type=channel_name:filter_details の形式を使用してレプリケーションチャネルを指定できます。 たとえば、サーバーの起動前にチャネル channel_1 および channel_2 が存在し、コマンドラインオプション --replicate-do-db=db1 --replicate-do-db=channel_1:db2 --replicate-do-db=db3 --replicate-ignore-db=db4 --replicate-ignore-db=channel_2:db5 を使用してレプリカを起動すると、次のようになります:

  • グローバルレプリケーションフィルタ: do_db=db1,db3, ignore_db=db4

  • channel_1 でのチャネル固有のフィルタ: do_db=db2 ignore_db=db4

  • channel_2 でのチャネル固有のフィルタ: do_db=db1,db3 ignore_db=db5

このような設定でレプリケーションフィルタを監視するには、replication_applier_global_filters テーブルと replication_applier_filters テーブルを使用します。

起動時のチャネル固有のレプリケーションフィルタの構成

レプリケーションフィルタ関連のコマンドオプションには、オプションの channel に続けてコロンを指定し、その後にフィルタ指定を指定できます。 最初のコロンはセパレータとして解釈され、後続のコロンはリテラルコロンとして解釈されます。 次のコマンドオプションは、この形式を使用したチャネル固有のレプリケーションフィルタをサポートしています:

  • --replicate-do-db=channel:database_id

  • --replicate-ignore-db=channel:database_id

  • --replicate-do-table=channel:table_id

  • --replicate-ignore-table=channel:table_id

  • --replicate-rewrite-db=channel:db1-db2

  • --replicate-wild-do-table=channel:table regexid

  • --replicate-wild-ignore-table=channel:table regexid

コロンを使用するが、--replicate-do-db=:database_id などのフィルタオプションに channel を指定しない場合、このオプションはデフォルトのレプリケーションチャネルのレプリケーションフィルタを構成します。 デフォルトのレプリケーションチャネルは、レプリケーションが開始されると常に存在するレプリケーションチャネルで、手動で作成するマルチソースレプリケーションチャネルとは異なります。 コロンも channel も指定されていない場合は、グローバルレプリケーションフィルタが構成されます。たとえば、--replicate-do-db=database_id はグローバル --replicate-do-db フィルタを構成します。

同じ from_name データベースで複数の rewrite-db=from_name->to_name オプションを構成すると、すべてのフィルタがまとめて追加され (rewrite_do リストに入れられます)、最初のフィルタが有効になります。

チャネル固有のレプリケーションフィルタのオンラインでの変更

--replicate-* オプションに加えて、CHANGE REPLICATION FILTER ステートメントを使用してレプリケーションフィルタを構成できます。 これにより、サーバーを再起動する必要がなくなりますが、変更中はレプリケーション SQL スレッドを停止する必要があります。 このステートメントで特定のチャネルにフィルタを適用するには、FOR CHANNEL channel 句を使用します。 例:

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

FOR CHANNEL 句が指定されている場合、ステートメントは指定されたチャネルレプリケーションフィルタに対して動作します。 複数のタイプのフィルタ (do_db, do_ignore_table, wild_do_table など) が指定されている場合、指定されたフィルタタイプのみがステートメントで置換されます。 マルチソースレプリカなどの複数のチャネルがあるレプリケーショントポロジでは、FOR CHANNEL 句が指定されていない場合、FOR CHANNEL の場合と同様のロジックを使用して、グローバルレプリケーションフィルタおよびすべてのチャネルのレプリケーションフィルタに対してステートメントが機能します。 詳細は、セクション13.4.2.2「CHANGE REPLICATION FILTER ステートメント」 を参照してください。

チャネル固有のレプリケーションフィルタの削除

チャネル固有のレプリケーションフィルタが構成されている場合は、空の filter type ステートメントを発行してフィルタを削除できます。 たとえば、channel_1 issue という名前のレプリケーションチャネルからすべての REPLICATE_REWRITE_DB フィルタを削除するには、次のコマンドを発行します:

CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB=() FOR CHANNEL channel_1;

コマンドオプションまたは CHANGE REPLICATION FILTER を使用して以前に構成された REPLICATE_REWRITE_DB フィルタは削除されます。

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