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"
上記の設定例では、ルール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
に対してクエリを実行します。3 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
デフォルトタイムゾーンは、タスク設定ファイルで指定されたタイムゾーンです。デフォルト値はダウンストリームのタイムゾーンです。3 c_timestamp = '2021-01-01 12:34:56.5678+08:00'
ように明示的にタイムゾーンを指定することもできます。
expression-filter
設定項目で複数のフィルタリングルールを設定できます。上流データソースは、 expression-filters
の必要なルールを参照してルールを有効にします。複数のルールを使用する場合、いずれかのルールに一致すると、行の変更全体がフィルタリングされます。
注記:
式フィルタリング ルールを多く設定しすぎると、DM の計算オーバーヘッドが増加し、データ複製が遅くなります。