TiDB データ移行Binlogイベント フィルター
TiDB Data Migration (DM) は、エラーをフィルタリングしてブロックし、レポートしたり、一部のスキーマまたはテーブルの指定されたタイプのbinlogイベントのみを受信したりするためのbinlogイベント フィルター機能を提供します。たとえば、 TRUNCATE TABLEつまたはINSERTのイベントをすべてフィルターで除外できます。 binlogイベント フィルター機能は、 ブロックリストと許可リスト機能よりも粒度が細かいです。
binlogイベントフィルターを構成する
タスク構成ファイルに次の構成を追加します。
filters:
rule-1:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["truncate table", "drop table"]
sql-pattern: ["^DROP\\s+PROCEDURE", "^CREATE\\s+PROCEDURE"]
action: Ignore
DM v2.0.2 以降、ソース構成ファイルでbinlogイベント フィルターを構成できます。詳細はアップストリーム データベースコンフィグレーションファイルを参照してください。
スキーマとテーブルの一致にワイルドカードを使用する場合は、次の点に注意してください。
schema-patternとtable-pattern、*、?、および[]を含むワイルドカードのみをサポートします。ワイルドカード一致では*シンボルは 1 つだけ使用でき、最後になければなりません。たとえば、table-pattern: "t_*"では、"t_*"t_で始まるすべてのテーブルを示します。詳細はワイルドカードマッチング参照してください。sql-patternは正規表現のみをサポートします。
パラメータの説明
schema-pattern/table-pattern:schema-pattern/table-patternに一致するアップストリーム MySQL または MariaDB インスタンス テーブルのbinlogイベントまたは DDL SQL ステートメントは、以下のルールによってフィルターされます。events:binlogイベント配列。次の表から 1 つ以上のEventのみを選択できます。sql-pattern: 指定された DDL SQL ステートメントをフィルタリングするために使用されます。一致ルールでは正規表現の使用がサポートされています。たとえば、"^DROP\\s+PROCEDURE"。action: 文字列 (Do/Ignore/Error)。ルールに基づき、以下のように判断します。Do: 許可リスト。binlogは、次の 2 つの条件のいずれかでフィルタリングされます。- イベントのタイプはルールのリスト
eventにありません。 - イベントの SQL ステートメントはルールの
sql-patternと一致できません。
- イベントのタイプはルールのリスト
Ignore: ブロックリスト。binlogは、次の 2 つの条件のいずれかでフィルタリングされます。- イベントのタイプはルールのリスト
eventにあります。 - イベントの SQL ステートメントは、ルールの
sql-patternと照合できます。
- イベントのタイプはルールのリスト
Error: エラーリスト。 binlog は、次の 2 つの条件のいずれかでエラーを報告します。- イベントのタイプはルールのリスト
eventにあります。 - イベントの SQL ステートメントは、ルールの
sql-patternと照合できます。
- イベントのタイプはルールのリスト
- 複数のルールが同じテーブルに一致する場合、ルールは順番に適用されます。ブロック リストはエラー リストよりも優先度が高く、エラー リストは許可リストよりも優先度が高くなります。例えば:
IgnoreとError両方のルールが同じテーブルに適用される場合、Ignoreルールが有効になります。ErrorとDo両方のルールが同じテーブルに適用される場合、Errorルールが有効になります。
使用例
このセクションでは、シャーディング (シャードされたスキーマとテーブル) のシナリオでの使用例を示します。
すべてのシャーディング削除操作をフィルタリングする
すべての削除操作をフィルターで除外するには、次の 2 つのフィルター ルールを構成します。
filter-table-ruletest_*に一致するすべてのテーブルのTRUNCATE TABLE、DROP TABLE、およびDELETE STATEMENT操作を除外します。t_*パターン。filter-schema-ruletest_*パターンに一致するすべてのスキーマのDROP DATABASE操作を除外します。
filters:
filter-table-rule:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["truncate table", "drop table", "delete"]
action: Ignore
filter-schema-rule:
schema-pattern: "test_*"
events: ["drop database"]
action: Ignore
シャーディング DML ステートメントのみを移行する
シャーディング DML ステートメントのみを移行するには、次の 2 つのフィルタリング ルールを構成します。
do-table-ruletest_*に一致するすべてのテーブルのCREATE TABLE、INSERT、UPDATE、およびDELETEステートメントのみを移行します。t_*パターン。do-schema-ruleパターンtest_*に一致するすべてのスキーマのステートメントCREATE DATABASEのみを移行します。
注記:
CREATE DATABASE/TABLEステートメントが移行される理由は、DML ステートメントはスキーマとテーブルの作成後にのみ移行できるためです。
filters:
do-table-rule:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["create table", "all dml"]
action: Do
do-schema-rule:
schema-pattern: "test_*"
events: ["create database"]
action: Do
TiDB がサポートしていない SQL ステートメントをフィルタリングして除外します。
TiDB がサポートしていないPROCEDUREステートメントをフィルタリングして除外するには、次のfilter-procedure-ruleを構成します。
filters:
filter-procedure-rule:
schema-pattern: "test_*"
table-pattern: "t_*"
sql-pattern: ["^DROP\\s+PROCEDURE", "^CREATE\\s+PROCEDURE"]
action: Ignore
filter-procedure-rule test_*に一致するすべてのテーブルの^CREATE\\s+PROCEDUREおよび^DROP\\s+PROCEDUREステートメントを除外します。 t_*パターン。
TiDB パーサーがサポートしていない SQL ステートメントをフィルターで除外します。
TiDB パーサーがサポートしていない SQL ステートメントの場合、DM はそれらを解析してschema / tableの情報を取得できません。したがって、グローバル フィルタリング ルールschema-pattern: "*"を使用する必要があります。
注記:
移行する必要があるデータがフィルターで除外されないようにするには、グローバル フィルター ルールをできるだけ厳密に構成する必要があります。
TiDB パーサー (一部のバージョン) がサポートしていないPARTITIONステートメントをフィルターで除外するには、次のフィルター ルールを構成します。
filters:
filter-partition-rule:
schema-pattern: "*"
sql-pattern: ["ALTER\\s+TABLE[\\s\\S]*ADD\\s+PARTITION", "ALTER\\s+TABLE[\\s\\S]*DROP\\s+PARTITION"]
action: Ignore
一部の DDL ステートメントのエラーを報告する
DM が TiDB に DDL ステートメントをレプリケートする前に、一部のアップストリーム操作によって生成された DDL ステートメントのエラーをブロックして報告する必要がある場合は、次の設定を使用できます。
filters:
filter-procedure-rule:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["truncate table", "truncate table partition"]
action: Error