如何过滤 binlog 事件
本文档介绍使用 DM 持续增量数据同步时,如何过滤 binlog 事件。具体迁移操作可参考已有数据迁移场景:
- 从小数据量 MySQL 迁移数据到 TiDB
 - 从大数据量 MySQL 迁移数据到 TiDB
 - 从小数据量分库分表 MySQL 合并迁移数据到 TiDB
 - 从大数据量分库分表 MySQL 合并迁移数据到 TiDB
 
配置方式
配置 DM 的任务配置文件时,增加如下filter,具体配置示例如下图:
filters:
  rule-1:
    schema-pattern: "test_*"
    table-pattern: "t_*"
    events: ["truncate table", "drop table"]
    sql-pattern: ["^DROP\\s+PROCEDURE", "^CREATE\\s+PROCEDURE"]
    action: Ignore
schema-pattern/table-pattern:对匹配上的 schema 或 table 进行过滤events:binlog events,支持的 Event 如下表所示:
| Event | 分类 | 说明 | 
|---|---|---|
| all | 匹配所有 events | |
| all dml | 匹配所有 DML events | |
| all ddl | 匹配所有 DDL events | |
| none | 不匹配任何 events | |
| none ddl | 不包含任何 DDL events | |
| none dml | 不包含任何 DML events | |
| insert | DML | 匹配 insert DML event | 
| update | DML | 匹配 update DML event | 
| delete | DML | 匹配 delete DML event | 
| create database | DDL | 匹配 create database event | 
| drop database | DDL | 匹配 drop database event | 
| create table | DDL | 匹配 create table event | 
| create index | DDL | 匹配 create index event | 
| drop table | DDL | 匹配 drop table event | 
| truncate table | DDL | 匹配 truncate table event | 
| rename table | DDL | 匹配 rename table event | 
| drop index | DDL | 匹配 drop index event | 
| alter table | DDL | 匹配 alter table event | 
sql-pattern:匹配指定的 DDL SQL 语句,支持正则表达式匹配。action:可取值 Do 或 Ignore。Do:白名单。binlog event 如果满足下面两个条件之一将会被同步:- 符合 events 条件;
 - sql-pattern 不为空,且对应的 SQL 可以匹配上 sql-pattern 中任意一项。
 
Ignore:黑名单。如果满足下面两个条件之一就会被过滤掉:- 符合 events 条件;
 - sql-pattern 不为空,且对应的 SQL 可以匹配上 sql-pattern 中任意一项
 
注意:如果同时配置 Do/Ignore,则 Ignore 优先级更高。binlog event 不匹配白名单或者匹配黑名单都将被直接过滤。
使用场景举例
过滤分库分表的所有删除操作
设置 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 操作
设置两个 Binlog event filter rule:
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 语句
filters:
  filter-procedure-rule:
    schema-pattern: "*"
    sql-pattern: [".*\\s+DROP\\s+PROCEDURE", ".*\\s+CREATE\\s+PROCEDURE", "ALTER\\s+TABLE[\\s\\S]*ADD\\s+PARTITION", "ALTER\\s+TABLE[\\s\\S]*DROP\\s+PARTITION"]
    action: Ignore