Changefeed 日志过滤器

TiCDC 支持基于表和事件两个维度的过滤功能,本文分别介绍两种过滤器的使用方法。

Table Filter 表过滤器

TiCDC 支持基于库表名的过滤功能,你可以通过下列配置来选定或过滤掉指定的表:

  1. [filter]
  2. # 过滤器规则
  3. rules = ['*.*', '!test.*']

常见的过滤器规则示例:

  • rules = ['*.*']
    • 同步所有的表(不包含系统表)
  • rules = ['test1.*']
    • 同步库 test1 下的所有表
  • rules = ['*.*', '!scm1.tbl2']
    • 同步所有的表但排除表 scm1.tbl2
  • rules = ['scm1.tbl2', 'scm1.tbl3']
    • 只同步表 scm1.tbl2scm1.tbl3
  • rules = ['scm1.tidb_*']
    • 同步库 scm1 下所有表名前缀为 tidb_ 的表

更多用法说明参见:库表过滤语法

Event Filter 事件过滤器 从 v6.2.0 版本开始引入

TiCDC 在 v6.2.0 中新增了事件过滤器功能,你可以通过配置该规则来过滤符合指定条件的 DML 和 DDL 事件。

以下是事件过滤器的配置规则示例:

  1. [filter]
  2. # 事件过滤器的规则应该写在 filter 配置项之下,可以同时配置多个事件过滤器。
  3. [[filter.event-filters]]
  4. matcher = ["test.worker"] # 该过滤规则只应用于 test 库中的 worker 表
  5. ignore-event = ["insert"] # 过滤掉 insert 事件
  6. ignore-sql = ["^drop", "add column"] # 过滤掉以 "drop" 开头或者包含 "add column" 的 DDL
  7. ignore-delete-value-expr = "name = 'john'" # 过滤掉包含 name = 'john' 条件的 delete DML
  8. ignore-insert-value-expr = "id >= 100" # 过滤掉包含 id >= 100 条件的 insert DML
  9. ignore-update-old-value-expr = "age < 18 or name = 'lili'" # 过滤掉旧值 age < 18 或 name = 'lili' 的 update DML
  10. ignore-update-new-value-expr = "gender = 'male' and age > 18" # 过滤掉新值 gender = 'male' 且 age > 18 的 update DML

配置参数说明:

  • matcher:该事件过滤器所要匹配的数据库名和表名,其匹配规则和表库过滤规则相一致。
  • ignore-event:要过滤的事件类型,它是一个字符串数组,可以配置多个事件类型。目前支持的类型如下表所示:
Event分类别名说明
all dml匹配所有 DML events
all ddl匹配所有 DDL events
insertDML匹配 insert DML event
updateDML匹配 update DML event
deleteDML匹配 delete DML event
create schemaDDLcreate database匹配 create database event
drop schemaDDLdrop database匹配 drop database event
create tableDDL匹配 create table event
drop tableDDL匹配 drop table event
rename tableDDL匹配 rename table event
truncate tableDDL匹配 truncate table event
alter tableDDL匹配 alter table event (包含 alter table 的所有子句和 create/drop index)
add table partitionDDL匹配 add table partition event
drop table partitionDDL匹配 drop table partition event
truncate table partitionDDL匹配 truncate table partition event
create viewDDL匹配 create view event
drop viewDDL匹配 drop view event
  • ignore-sql:要过滤的 DDL 语句的正则表达式。该参数接受一个字符串数组,数组中可以配置多条正则表达式。该配置仅对 DDL 事件生效。
  • ignore-delete-value-expr:配置一个 SQL 表达式,对带有指定值的 DELETE 类型的 DML 事件生效。
  • ignore-insert-value-expr:配置一个 SQL 表达式,对带有指定值的 INSERT 类型的 DML 事件生效。
  • ignore-update-old-value-expr:配置一个 SQL 表达式,对带有指定旧值的 UPDATE 类型的 DML 事件生效。
  • ignore-update-new-value-expr:配置一个 SQL 表达式,对带有指定新值的 UPDATE 类型的 DML 事件生效。

日志过滤器 - 图1

注意

  • TiDB 在更新聚簇索引的列值时,会将一个 UPDATE 事件拆分成为 DELETE 和 INSERT 事件,TiCDC 无法将该类事件识别为 UPDATE 事件,因此无法正确地进行过滤。

  • 在配置 SQL 表达式时,请确保符合 matcher 规则的所有表均包含了对应 SQL 表达式中指明的所有列,否则同步任务将无法创建成功。此外,若在同步的过程中表的结构发生变化,不再包含 SQL 表达式中的列,那么同步任务将会进入无法自动恢复的错误状态,你需要手动修改配置并进行恢复操作。

DDL 白名单

目前 TiCDC 在同步 DDL 时使用白名单策略,只有在白名单内部的 DDL 会同步到下游,不在白名单内的 DDL 不会被 TiCDC 同步到下游。

以下为 TiCDC 支持同步的 DDL 的列表。

  • create database
  • drop database
  • create table
  • drop table
  • add column
  • drop column
  • create index / add index
  • drop index
  • truncate table
  • modify column
  • rename table
  • alter column default value
  • alter table comment
  • rename index
  • add partition
  • drop partition
  • truncate partition
  • create view
  • drop view
  • alter table character set
  • alter database character set
  • recover table
  • add primary key
  • drop primary key
  • rebase auto id
  • alter table index visibility
  • exchange partition
  • reorganize partition
  • alter table ttl
  • alter table remove ttl