重要
このページは英語版のページを機械翻訳しています。原文はこちらからご覧ください。

SQL式を使用してDMLイベントをフィルタリングする

このドキュメントでは、DMを使用して継続的な増分データレプリケーションを実行するときに、SQL式を使用してbinlogイベントをフィルタリングする方法を紹介します。複製手順の詳細については、次のドキュメントを参照してください。

インクリメンタルデータレプリケーションを実行する場合、 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-exprINSERTのタイプのbinlogイベント(WRITE_ROWS_EVENT)によって運ばれる値に影響を与える式を構成します。この式を同じ構成delete-value-exprupdate-old-value-expr 、またはupdate-new-value-exprと一緒に使用することはできません。
  • update-old-value-exprUPDATEのタイプのbinlogイベント(UPDATE_ROWS_EVENT)によって運ばれる古い値を有効にする式を構成します。この式を同じ構成項目でinsert-value-exprまたはdelete-value-exprと一緒に使用することはできません。
  • update-new-value-exprUPDATEのタイプのbinlogイベント(UPDATE_ROWS_EVENT)によって運ばれる新しい値に影響を与える式を構成します。この式を同じ構成項目でinsert-value-exprまたはdelete-value-exprと一緒に使用することはできません。
  • delete-value-exprDELETEのタイプのbinlogイベント(DELETE_ROWS_EVENT)によって運ばれる値に影響を与える式を構成します。この式をinsert-value-expr 、またはupdate-old-value-exprと一緒に使用することはできませupdate-new-value-expr

ノート:

  • update-old-value-exprupdate-new-value-exprを一緒に構成できます。
  • update-old-value-exprupdate-new-value-exprが一緒に構成されている場合、「更新+古い値」がupdate-old-value-expr一致し、「更新+新しい値」がupdate-new-value-exprに一致する行がフィルター処理されます。
  • update-old-value-exprupdate-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の計算オーバーヘッドが増加し、データレプリケーションの速度が低下します。