SQL式を使用したDMLイベントのフィルタリング
このドキュメントでは、DM を使用して継続的な増分データ レプリケーションを実行する場合に、SQL 式を使用してbinlogイベントをフィルタリングする方法を紹介します。レプリケーション手順の詳細については、次のドキュメントを参照してください。
- 小規模なデータセットを MySQL から TiDB に移行する
 - 大規模なデータセットを MySQL から TiDB に移行する
 - 小規模なデータセットの MySQL シャードを TiDB に移行およびマージする
 - 大規模なデータセットの MySQL シャードを TiDB に移行およびマージする
 
増分データ レプリケーションを実行する場合、 Binlogイベントフィルターを使用して特定の種類のbinlogイベントをフィルターできます。たとえば、アーカイブや監査などの目的でDELETEイベントをダウンストリームにレプリケートしないことを選択できます。ただし、 Binlogイベント フィルターは、より細かい粒度が必要な行のDELETEのイベントをフィルターするかどうかを決定できません。
この問題に対処するために、DM は v2.0.5 以降、増分データ レプリケーションで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"
上記の構成例では、データソースmysql-replica-01からルールeven_cが設定され参照されています。このルールに従って、スキーマ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)
コンフィグレーションパラメータと説明
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のいずれかが設定されている場合、設定された式は行の変更全体をフィルタリングするかどうかを決定します。これは、古い値の削除と新しい値の挿入が全体としてフィルタリングされることを意味します。
SQL 式は 1 つの列または複数の列で使用できます。 TiDB でサポートされている SQL関数( c % 2 = 0 、 a*a + b*b = c*c 、 ts > NOW()など) を使用することもできます。
TIMESTAMPデフォルトのタイムゾーンは、タスク構成ファイルで指定されたタイムゾーンです。デフォルト値はダウンストリームのタイムゾーンです。 c_timestamp = '2021-01-01 12:34:56.5678+08:00'のような方法でタイムゾーンを明示的に指定できます。
expression-filterの設定項目の下に複数のフィルタリング ルールを設定できます。上流のデータ ソースは、 expression-filtersで必要なルールを参照して有効にします。複数のルールが使用されている場合、いずれかのルールが一致すると、行の変更全体がフィルタリングされます。
注記:
構成する式フィルタリング ルールが多すぎると、DM の計算オーバーヘッドが増加し、データ レプリケーションの速度が低下します。