TiDB データ移行Binlogイベント フィルター

TiDB データ移行 (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-patterntable-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のみを選択できます。

    イベントタイプ説明
    all以下のすべてのイベントが含まれます
    all dml以下のすべてのDMLイベントが含まれます
    all ddl以下のすべてのDDLイベントが含まれます
    incompatible ddl changes互換性のないすべての DDL イベントが含まれます。「互換性のない DDL」とは、データ損失を引き起こす可能性のある DDL 操作を意味します。
    none以下のイベントは含まれません
    none ddl以下の DDL イベントは含まれません
    none dml以下のDMLイベントは含まれません
    insertDMML のINSERT DMLイベント
    updateDMML のUPDATE DMLイベント
    deleteDMML のDELETE DMLイベント
    create databaseDDLCREATE DATABASE DDLイベント
    drop database互換性のない DDLDROP DATABASE DDLイベント
    create tableDDLCREATE TABLE DDLイベント
    create indexDDLCREATE INDEX DDLイベント
    drop table互換性のない DDLDROP TABLE DDLイベント
    truncate table互換性のない DDLTRUNCATE TABLE DDLイベント
    rename table互換性のない DDLRENAME TABLE DDLイベント
    drop index互換性のない DDLDROP INDEX DDLイベント
    alter tableDDLALTER TABLE DDLイベント
    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文(例: INTVARCHARに変更する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互換性のない DDLALTER 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互換性のない DDL2つのテーブル間でパーティションを交換する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は、次の 2 つの条件のいずれかでエラーを報告します。
      • イベントのタイプはルールのeventのリストにあります。
      • イベントの SQL ステートメントは、ルールのsql-patternに一致できます。
    • 複数のルールが同じテーブルに一致する場合、ルールは順番に適用されます。ブロック リストはエラー リストよりも優先度が高く、エラー リストは許可リストよりも優先度が高くなります。例:
      • ルールIgnoreErrorの両方が同じテーブルに適用される場合、ルールIgnoreが有効になります。
      • ルールErrorDoの両方が同じテーブルに適用される場合、ルールErrorが有効になります。

使用例

このセクションでは、シャーディング (シャードされたスキーマとテーブル) のシナリオでの使用例を示します。

すべてのシャーディング削除操作をフィルタリングする

すべての削除操作をフィルタリングするには、次の 2 つのフィルタリング ルールを構成します。

  • filter-table-ruletest_* . t_*パターンに一致するすべてのテーブルのTRUNCATE TABLEDROP 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-ruletest_* . t_*パターンに一致するすべてのテーブルのCREATE TABLEINSERTUPDATE 、および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-ruletest_* . 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

このページは役に立ちましたか?