TiDB データ移行Binlogイベント フィルター
TiDB データ移行 (DM) には、エラーをフィルター処理、ブロック、報告したり、一部のスキーマまたはテーブルに対して指定された種類のbinlogイベントのみを受信したりするための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は、次の 2 つの条件のいずれかでエラーを報告します。- イベントのタイプはルールの
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-ruletest_*パターンに一致するすべてのスキーマの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