TiDB Data Migration Binlog 事件过滤
TiDB Data Migration (DM) 的 Binlog 事件过滤 (Binlog event filter) 是比迁移表黑白名单更加细粒度的过滤规则,可以指定只迁移、过滤、或者拦截并报错某些 schema / table 的指定类型 binlog,比如 INSERT 和 TRUNCATE TABLE。
配置 Binlog 事件过滤
在迁移任务配置文件中,添加如下配置:
filters:
rule-1:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["truncate table", "drop table"]
sql-pattern: ["^DROP\\s+PROCEDURE", "^CREATE\\s+PROCEDURE"]
action: Ignore
从 DM v2.0.2 开始,你也可以在上游数据库配置文件中配置 Binlog 事件过滤。见上游数据库配置文件介绍。
使用通配符匹配库表名时,注意以下事项:
schema-pattern和table-pattern仅支持通配符,支持的通配符包括*、?和[]。注意通配符匹配中的*符号只能有一个,且必须在末尾。例如table-pattern: "t_*"中的"t_*"表示以t_开头的表。详情请参考通配符匹配。sql-pattern仅支持正则表达式。
参数解释
schema-pattern/table-pattern:对匹配上的上游 MySQL/MariaDB 实例的表的 binlog events 或者 DDL SQL 语句通过以下规则进行过滤。events:binlog events 数组,仅支持从以下Event中选择一项或多项。sql-pattern:用于过滤指定的 DDL SQL 语句,支持正则表达式匹配,例如上面示例中的"^DROP\\s+PROCEDURE"。action:string (Do/Ignore/Error);进行下面规则判断:Do:白名单。binlog event 如果满足下面两个条件之一就会被过滤掉:- 不在该 rule 的
events中。 - 如果规则的
sql-pattern不为空的话,对应的 SQL 没有匹配上sql-pattern中任意一项。
- 不在该 rule 的
Ignore:黑名单。如果满足下面两个条件之一就会被过滤掉:- 在该 rule 的
events中。 - 如果规则的
sql-pattern不为空的话,对应的 SQL 可以匹配上sql-pattern中任意一项。
- 在该 rule 的
Error:报错名单。如果满足下面两个条件之一就会报错:- 在该 rule 的
events中。 - 如果规则的
sql-pattern不为空的话,对应的 SQL 可以匹配上sql-pattern中任意一项。
- 在该 rule 的
- 同一个表匹配上多个规则时,将会按顺序依次应用这些规则,并且黑名单的优先级高于报错名单,报错名单的优先级高于白名单,即如果同时存在规则
Ignore和Error应用在某个表上,那么Ignore生效;如果同时存在规则Error和Do应用在某个表上,那么Error生效。
使用示例
过滤分库分表的所有删除操作
需要设置下面两个 Binlog event filter rule 来过滤掉所有的删除操作:
filter-table-rule过滤掉所有匹配到 patterntest_*.t_*的 table 的turncate table、drop table、delete statement操作。filter-schema-rule过滤掉所有匹配到 patterntest_*的 schema 的drop database操作。
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 操作
需要设置下面两个 Binlog event filter rule 只迁移 DML 操作:
do-table-rule只迁移所有匹配到 patterntest_*.t_*的 table 的create table、insert、update、delete操作。do-schema-rule只迁移所有匹配到 patterntest_*的 schema 的create database操作。
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 语句
可设置如下规则过滤 TiDB 不支持的 PROCEDURE 语句:
filters:
filter-procedure-rule:
schema-pattern: "test_*"
table-pattern: "t_*"
sql-pattern: ["^DROP\\s+PROCEDURE", "^CREATE\\s+PROCEDURE"]
action: Ignore
过滤 TiDB parser 不支持的 SQL 语句
对于 TiDB parser 不支持的 SQL 语句,DM 无法解析获得 schema/table 信息,因此需要使用全局过滤规则:schema-pattern: "*"。
可设置如下规则过滤某些版本的 TiDB parser 不支持的 PARTITION 语句:
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
对部分 DDL 语句报错
如需在 DM 同步上游业务数据到 TiDB 之前对部分 DDL 语句进行拦截并报错,可采用如下设置:
filters:
filter-procedure-rule:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["truncate table", "truncate table partition"]
action: Error