SQL 式を使用した DML イベントのフィルタリング
このドキュメントでは、DM を使用して継続的な増分データ レプリケーションを実行するときに、SQL 式を使用して binlog イベントをフィルター処理する方法を紹介します。詳細なレプリケーション手順については、次のドキュメントを参照してください。
- 小さなデータセットの MySQL を TiDB に移行する
 - 大規模なデータセットの MySQL を TiDB に移行する
 - 小さなデータセットの MySQL シャードを TiDB に移行およびマージする
 - 大規模なデータセットの MySQL シャードを TiDB に移行およびマージする
 
増分データ レプリケーションを実行する場合、 Binlogイベント フィルタを使用して特定の種類の binlog イベントをフィルター処理できます。たとえば、アーカイブや監査などの目的で、 DELETEのイベントをダウンストリームに複製しないことを選択できます。ただし、 Binlog Event Filter は、より細かい粒度が必要な行のDELETEイベントをフィルタリングするかどうかを判断できません。
この問題に対処するために、v2.0.5 以降、DM は増分データ レプリケーションでbinlog value filterを使用してデータをフィルタリングすることをサポートしています。 DM がサポートするROW形式の binlog の中で、binlog イベントはすべての列の値を保持し、これらの値に基づいて SQL 式を構成できます。式が行の変更をTRUEと計算する場合、DM はこの行の変更を下流にレプリケートしません。
Binlogイベント フィルタと同様に、タスク構成ファイルでbinlog value filterを構成する必要があります。詳細については、次の構成例を参照してください。高度なタスクの設定と説明については、 DM 高度なタスク構成ファイルを参照してください。
name: test
task-mode: all
mysql-instances:
  - source-id: "mysql-replica-01"
    expression-filters: ["even_c"]
expression-filter:
  even_c:
    schema: "expr_filter"
    table: "tbl"
    insert-value-expr: "c % 2 = 0"
上記の構成例では、 even_cのルールが構成され、データソースmysql-replica-01によって参照されます。この規則に従って、 expr_filterスキーマのtb1テーブルでは、 c列に偶数が挿入された場合 ( c % 2 = 0 )、このinsertステートメントは下流に複製されません。次の例は、このルールの効果を示しています。
アップストリーム データ ソースに次のデータを段階的に挿入します。
INSERT INTO tbl(id, c) VALUES (1, 1), (2, 2), (3, 3), (4, 4);
次に、ダウンストリームでtb1のテーブルをクエリします。 cの奇数の行だけが複製されていることがわかります。
MySQL [test]> select * from tbl;
+------+------+
| id   | c    |
+------+------+
|    1 |    1 |
|    3 |    3 |
+------+------+
2 rows in set (0.001 sec)
Configuration / コンフィグレーションパラメータと説明
schema: 一致するアップストリーム スキーマの名前。ワイルドカード マッチングまたは通常のマッチングはサポートされていません。table: 照合するアップストリーム テーブルの名前。ワイルドカード マッチングまたは通常のマッチングはサポートされていません。insert-value-expr:INSERT種類の binlog イベント (WRITE_ROWS_EVENT) によって運ばれる値に有効な式を構成します。この式を同じ構成アイテムでupdate-old-value-expr、update-new-value-exprまたはdelete-value-exprと一緒に使用することはできません。update-old-value-expr:UPDATEのタイプの binlog イベント (UPDATE_ROWS_EVENT) によって運ばれる古い値に有効な式を構成します。この式は、同じ構成アイテム内でinsert-value-exprまたはdelete-value-exprと一緒に使用することはできません。update-new-value-expr:UPDATE種類の binlog イベント (UPDATE_ROWS_EVENT) によって運ばれる新しい値に有効な式を構成します。この式は、同じ構成アイテム内でinsert-value-exprまたはdelete-value-exprと一緒に使用することはできません。delete-value-expr:DELETE種類の binlog イベント (DELETE_ROWS_EVENT) によって運ばれる値に有効な式を構成します。この式をinsert-value-expr、update-old-value-exprまたはupdate-new-value-exprと一緒に使用することはできません。
ノート:
update-old-value-exprとupdate-new-value-exprを一緒に設定できます。update-old-value-exprとupdate-new-value-exprを一緒に構成すると、「更新 + 古い値」がupdate-old-value-exprを満たす行と、「更新 + 新しい値」がupdate-new-value-exprを満たす行がフィルター処理されます。update-old-value-exprとupdate-new-value-exprのいずれかが構成されている場合、構成された式によって行変更全体をフィルター処理するかどうかが決定されます。つまり、古い値の削除と新しい値の挿入が全体としてフィルター処理されます。
1 つの列または複数の列で SQL 式を使用できます。 c % 2 = 0 、 a*a + b*b = c*c 、 ts > NOW()など、TiDB でサポートされている SQL関数を使用することもできます。
TIMESTAMPのデフォルトのタイム ゾーンは、タスク構成ファイルで指定されたタイム ゾーンです。デフォルト値は、ダウンストリームのタイム ゾーンです。 c_timestamp = '2021-01-01 12:34:56.5678+08:00'のような方法でタイムゾーンを明示的に指定できます。
expression-filterの設定項目で複数のフィルタリング ルールを設定できます。アップストリーム データ ソースは、 expression-filtersで必要なルールを参照して有効にします。複数のルールが使用されている場合、いずれかのルールが一致すると、行の変更全体がフィルター処理されます。
ノート:
構成する式フィルタリング ルールが多すぎると、DM の計算オーバーヘッドが増加し、データ レプリケーションが遅くなります。