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)によって運ばれる値に影響を与える式を構成します。この式を同じ構成delete-value-expr
でupdate-old-value-expr
、またはupdate-new-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つの列または複数の列で使用できます。 c % 2 = 0
などのa*a + b*b = c*c
でサポートされているSQL関数を使用することもできts > NOW()
。
TIMESTAMP
のデフォルトのタイムゾーンは、タスク構成ファイルで指定されたタイムゾーンです。デフォルト値は、ダウンストリームのタイムゾーンです。 c_timestamp = '2021-01-01 12:34:56.5678+08:00'
のようにタイムゾーンを明示的に指定できます。
expression-filter
の構成項目で複数のフィルタリングルールを構成できます。アップストリームデータソースは、 expression-filters
の必要なルールを参照して、それを有効にします。複数のルールが使用されている場合、いずれかのルールが一致すると、行の変更全体がフィルタリングされます。
ノート:
構成する式フィルタリングルールが多すぎると、DMの計算オーバーヘッドが増加し、データレプリケーションの速度が低下します。