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イベント フィルターを構成できます。詳細については、 アップストリーム データベースコンフィグレーションファイルを参照してください。
単純なシナリオでは、スキーマとテーブルの一致にワイルドカードを使用することをお勧めします。ただし、次のバージョンの違いに注意してください。
DM v1.0.5 以降のバージョンの場合、 binlogイベント フィルターはワイルドカードマッチサポートしますが、ワイルドカード式で指定できるのは
*だけであり、最後に*を配置する必要があります。v1.0.5 より前のバージョンの DM の場合、 binlogイベント フィルターはワイルドカードをサポートしますが、
[...]と[!...]式はサポートしません。
パラメータの説明
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)。以下のルールに基づいて、フィルタリングするかどうかを判断します。 2 つのルールのいずれかが満たされる場合、binlogはフィルタリングされます。それ以外の場合、binlogはフィルタリングされません。Do: 許可リスト。 binlog は、次の 2 つの条件のいずれかでフィルター処理されます。- イベントのタイプがルールの
eventリストにありません。 - イベントの SQL ステートメントは、ルールの
sql-patternつと一致しません。
- イベントのタイプがルールの
Ignore: ブロック リスト。 binlog は、次の 2 つの条件のいずれかでフィルター処理されます。- イベントのタイプは、ルールの
eventリストにあります。 - イベントの SQL ステートメントは、ルールの
sql-patternに一致できます。
- イベントのタイプは、ルールの
- 複数のルールが同じテーブルに一致する場合、ルールは順番に適用されます。ブロック リストは、許可リストよりも優先度が高くなります。たとえば、
IgnoreとDoの両方のルールが同じテーブルに適用される場合、Ignoreルールが有効になります。
使用例
このセクションでは、シャーディングのシナリオ (シャードされたスキーマとテーブル) での使用例を示します。
すべてのシャーディング削除操作をフィルタリングする
すべての削除操作を除外するには、次の 2 つのフィルタリング ルールを構成します。
filter-table-ruletest_*に一致するすべてのテーブルのTRUNCATE TABLEDROP 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-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_*に一致するすべてのテーブルの^CREATE\\s+PROCEDUREおよび^DROP\\s+PROCEDUREステートメントを除外します。 t_*パターン。
TiDB パーサーがサポートしていない SQL ステートメントを除外する
TiDB パーサーtableサポートしていない SQL ステートメントの場合、DM はそれらを解析してschema情報を取得できません。したがって、グローバル フィルタリング ルール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