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-patterntable-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は、以下のいずれかの条件でエラーを報告します。- イベントのタイプはルールの
eventのリストにあります。 - イベントの SQL 文は、ルールの
sql-patternつに一致できます。
- イベントのタイプはルールの
- 複数のルールが同じテーブルに一致する場合、ルールは順番に適用されます。ブロックリストはエラーリストよりも優先度が高く、エラーリストは許可リストよりも優先度が高くなります。例:
- ルール
IgnoreとError両方が同じテーブルに適用された場合、ルールIgnore有効になります。 - ルール
ErrorとDo両方が同じテーブルに適用された場合、ルールError有効になります。
- ルール
使用例
このセクションでは、シャーディング (シャードされたスキーマとテーブル) のシナリオでの使用例を示します。
すべてのシャーディング削除操作をフィルタリングする
すべての削除操作をフィルタリングするには、次の 2 つのフィルタリング ルールを構成します。
filter-table-rule、test_*.t_*パターンに一致するすべてのテーブルのTRUNCATE TABLE、DROP TABLE、およびDELETE STATEMENT操作を除外します。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-rule、test_*.t_*パターンに一致するすべてのテーブルのCREATE TABLE、INSERT、UPDATE、およびDELETEステートメントのみを移行します。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_* . t_*パターンに一致するすべてのテーブルの^CREATE\\s+PROCEDUREと^DROP\\s+PROCEDUREステートメントを除外します。
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 ステートメントのエラーをブロックして報告する必要がある場合は、次の設定を使用できます。
filters:
filter-procedure-rule:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["truncate table", "truncate table partition"]
action: Error