如何过滤 binlog 事件

本文档介绍使用 DM 持续增量数据同步时,如何过滤 binlog 事件。具体迁移操作可参考已有数据迁移场景:

配置方式

配置 DM 的任务配置文件时,增加如下filter,具体配置示例如下图:

  1. filters:
  2. rule-1:
  3. schema-pattern: "test_*"
  4. table-pattern: "t_*"
  5. events: ["truncate table", "drop table"]
  6. sql-pattern: ["^DROP\\s+PROCEDURE", "^CREATE\\s+PROCEDURE"]
  7. 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
insertDML匹配 insert DML event
updateDML匹配 update DML event
deleteDML匹配 delete DML event
create databaseDDL匹配 create database event
drop databaseDDL匹配 drop database event
create tableDDL匹配 create table event
create indexDDL匹配 create index event
drop tableDDL匹配 drop table event
truncate tableDDL匹配 truncate table event
rename tableDDL匹配 rename table event
drop indexDDL匹配 drop index event
alter tableDDL匹配 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-rulefilter-schema-rule 两个过滤规则,具体如下:

  1. filters:
  2. filter-table-rule:
  3. schema-pattern: "test_*"
  4. table-pattern: "t_*"
  5. events: ["truncate table", "drop table", "delete"]
  6. action: Ignore
  7. filter-schema-rule:
  8. schema-pattern: "test_*"
  9. events: ["drop database"]
  10. action: Ignore

只迁移分库分表的 DML 操作

设置两个 Binlog event filter rule

  1. filters:
  2. do-table-rule:
  3. schema-pattern: "test_*"
  4. table-pattern: "t_*"
  5. events: ["create table", "all dml"]
  6. action: Do
  7. do-schema-rule:
  8. schema-pattern: "test_*"
  9. events: ["create database"]
  10. action: Do

过滤 TiDB 不支持的 SQL 语句

  1. filters:
  2. filter-procedure-rule:
  3. schema-pattern: "*"
  4. 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"]
  5. action: Ignore

如何根据类型或 DDL 内容过滤 binlog 事件 - 图1

注意

全局过滤规则的设置必须尽可能严格,以避免过滤掉需要迁移的数据。

探索更多