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のみを選択できます。イベント タイプ 説明 all以下のすべてのイベントが含まれます all dml以下のすべてのDMLイベントが含まれます all ddl以下のすべてのDDLイベントが含まれます incompatible ddl changes互換性のないすべての DDL イベントが含まれます。「互換性のない DDL」とは、データ損失を引き起こす可能性のある DDL 操作を意味します。 none以下のイベントは含まれません none ddl以下の DDL イベントは含まれません none dml以下のDMLイベントは含まれません insertDML INSERTDMLイベントupdateDML UPDATEDMLイベントdeleteDML DELETEDMLイベントcreate databaseDDL 第 CREATE DATABASEDDLイベントdrop database互換性のないDDL 第 DROP DATABASEDDLイベントcreate tableDDL 第 CREATE TABLEDDLイベントcreate indexDDL 第 CREATE INDEXDDLイベントdrop table互換性のないDDL 第 DROP TABLEDDLイベントtruncate table互換性のないDDL 第 TRUNCATE TABLEDDLイベントrename table互換性のないDDL 第 RENAME TABLEDDLイベントdrop index互換性のないDDL 第 DROP INDEXDDLイベントalter tableDDL 第 ALTER TABLEDDLイベントvalue range decrease互換性のないDDL 列フィールドの値の範囲を減らすDDL文(例えば、 VARCHAR(20)をVARCHAR(10)に変更するALTER TABLE MODIFY COLUMN文)precision decrease互換性のないDDL 列フィールドの精度を下げるDDL文(例えば、 Decimal(10, 2)をDecimal(10, 1)に変更するALTER TABLE MODIFY COLUMN文)modify column互換性のないDDL 列フィールドの型を変更するDDL文( INTをVARCHARに変更するALTER TABLE MODIFY COLUMN文など)rename column互換性のないDDL 列の名前を変更するDDL文( ALTER TABLE RENAME COLUMN文など)rename index互換性のないDDL インデックス名を変更するDDL文( ALTER TABLE RENAME INDEX文など)drop column互換性のないDDL テーブルから列を削除するDDL文( ALTER TABLE DROP COLUMN文など)drop index互換性のないDDL テーブルのインデックスを削除するDDL文 ALTER TABLE DROP INDEX文など)truncate table partition互換性のないDDL 指定されたパーティションからすべてのデータを削除するDDL文( ALTER TABLE TRUNCATE PARTITION文など)drop primary key互換性のないDDL 主キーを削除するDDL文 ALTER TABLE DROP PRIMARY KEY文など)drop unique key互換性のないDDL ALTER TABLE DROP UNIQUE KEY文のような、一意のキーを削除する DDL 文modify default value互換性のないDDL 列のデフォルト値を変更するDDL文( ALTER TABLE CHANGE DEFAULT文など)modify constraint互換性のないDDL 制約を変更するDDL文 ALTER TABLE ADD CONSTRAINT文など)modify columns order互換性のないDDL 列の順序を変更するDDL文( ALTER TABLE CHANGE AFTER文など)modify charset互換性のないDDL 列の文字セットを変更するDDL文( ALTER TABLE MODIFY CHARSET文など)modify collation互換性のないDDL 列の照合順序を変更するDDL文( ALTER TABLE MODIFY COLLATE文など)remove auto increment互換性のないDDL 自動増分キーを削除するDDL文 modify storage engine互換性のないDDL テーブルstorageエンジンを変更するDDL文( ALTER TABLE ENGINE = MyISAM文など)reorganize table partition互換性のないDDL テーブル内のパーティションを再編成するDDL文 ALTER TABLE REORGANIZE PARTITION文など)rebuild table partition互換性のないDDL テーブルパーティションを再構築するDDL文( ALTER TABLE REBUILD PARTITION文など)exchange table partition互換性のないDDL 2つのテーブル間でパーティションを交換するDDL文( ALTER TABLE EXCHANGE PARTITION文など)coalesce table partition互換性のないDDL テーブル内のパーティションの数を減らすDDL文( ALTER COALESCE PARTITION文など)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