Binlogイベントをフィルタリングする
このドキュメントでは、DMを使用して継続的な増分データレプリケーションを実行する際に、 binlogイベントをフィルタリングする方法について説明します。レプリケーションの詳細な手順については、シナリオごとに以下のドキュメントを参照してください。
- 小規模データセットをMySQLからTiDBに移行する
- 大規模データセットをMySQLからTiDBに移行する
- 小さなデータセットの MySQL シャードを TiDB に移行してマージする
- 大規模データセットの MySQL シャードを TiDB に移行およびマージする
設定
binlogイベントフィルターを使用するには、以下に示すように、DM のタスク設定ファイルにfiltersフィールドを追加します。
filters:
rule-1:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["truncate table", "drop table"]
action: Ignore
schema-pattern/table-pattern: 一致するスキーマまたはテーブルをフィルターしますevents: binlogイベントをフィルタリングします。サポートされているイベントは以下の表のとおりです。sql-pattern: 指定されたDDL SQL文をフィルタリングします。マッチングルールでは正規表現の使用がサポートされています。action:DoまたはIgnoreDo: 許可リスト。以下の2つの条件のいずれかを満たす場合、 binlogイベントは複製されます。- イベントはルール設定と一致します。
- sql-pattern が指定されており、イベントの SQL文が sql-pattern オプションのいずれかと一致します。
Ignore:ブロックリスト。以下の2つの条件のいずれかを満たす場合、 binlogイベントはフィルタリングされます。- イベントはルール設定と一致します。 - sql-pattern が指定されており、イベントの SQL文が sql-pattern オプションのいずれかと一致します。DoとIgnore両方が設定されている場合、Ignoreの方がDoよりも優先されます。つまり、IgnoreとDo両方の条件を満たすイベントは除外されます。
アプリケーションシナリオ
このセクションでは、 binlogイベントフィルターの適用シナリオについて説明します。
すべてのシャーディング削除操作を除外する
すべての削除操作を除外するには、次に示すようにfilter-table-ruleとfilter-schema-ruleを設定します。
filters:
filter-table-rule:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["truncate table", "drop table", "delete"]
action: Ignore
filter-schema-rule:
schema-pattern: "test_*"
events: ["drop database"]
action: Ignore
シャーディングされたスキーマとテーブルのDML操作のみを移行する
DML文のみをレプリケートするには、次に示すようにBinlog event filter ruleを 2つ設定します。
filters:
do-table-rule:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["create table", "all dml"]
action: Do
do-schema-rule:
schema-pattern: "test_*"
events: ["create database"]
action: Do
TiDB がサポートしていない SQL 文、または DM が解析できない SQL 文を処理する
CREATE PROCEDURE、DROP PROCEDURE、または ALTER PROCEDURE に対してフィルターを設定する必要はありません。DM はこれらのステートメントを自動的にスキップします。
MySQL でパーティションを追加または削除すると、DM は通常その変更を TiDB にレプリケートします。DM と TiDB の両方がサポートするパーティション操作にはフィルターは不要です。テーブルのパーティションタイプに対して TiDB がどの操作をサポートしているかを確認するには、パーティション管理 を参照してください。
ADD PARTITION または DROP PARTITION を使用する ALTER TABLE ステートメントに対して DM が解析エラーを報告し、そのパーティション変更を TiDB にレプリケートする必要がない場合は、以下のルールを使用してそのステートメントをスキップできます。DM で解析エラーが発生しても、必ずしも TiDB がその操作をサポートしていないことを意味するわけではありません。
DM がステートメントを解析できない場合、特定のスキーマまたはテーブルを対象とするフィルターを適用できません。この場合、schema-pattern: "*" を指定し、table-pattern を指定しないグローバルフィルタリングルールが必要です。このルールは、移行タスク内のすべてのテーブルに対する一致ステートメントに適用されます。
filters:
filter-partition-rule:
schema-pattern: "*"
sql-pattern: ["ALTER\\s+TABLE[\\s\\S]*ADD\\s+PARTITION", "ALTER\\s+TABLE[\\s\\S]*DROP\\s+PARTITION"]
action: Ignore