このページは機械翻訳したものです。
このセクションでは、マルチソースレプリケーショントポロジなどに複数のレプリケーションチャネルが存在する場合にレプリケーションフィルタを使用する方法について説明します。 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_db
、do_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
ステートメントは、ステートメントによって削除されたチャネルに設定されたチャネル固有のレプリケーションフィルタを削除します。 削除されたチャネルが再作成されると、レプリカに指定されたグローバルレプリケーションフィルタがそれらにコピーされ、チャネル固有のレプリケーションフィルタは適用されません。