DM不会同步TRUNCATE TABLE语句到下游

Bug 反馈
【 Bug 的影响】
移除filter_rules后,filter_rules还在生效中,不符合预期。比如说,前期设置了过滤TRUNCATE TABLE的操作,后续想移除这个过滤规则,发现还在生效中
【可能的问题复现步骤】

  1. 创建一个task,使用过滤规则
filters:                                        # 上游数据库实例匹配的表的 binlog event filter 规则集
 filter-rule-1:                                # 配置名称
   schema-pattern: "*"                    # 库名匹配规则,支持通配符 "*" 和 "?"
   table-pattern: "*"                        # 表名匹配规则,支持通配符 "*" 和 "?"
   events: ["truncate table", "drop table", "rename table"]    # 匹配哪些 event 类型
   action: Ignore                              # 对与符合匹配规则的 binlog 迁移(Do)还是忽略(Ignore)

block-allow-list:                    # 定义数据源迁移表的过滤规则,可以定义多个规则。如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
 single-rule:
   do-tables:
   - db-name: "test_db1"
     tbl-name: "*"

# ----------- 实例配置 -----------
mysql-instances:
 -
   source-id: "source-1"           # 对应 source.toml 中的 `source-id`

   filter-rules: ["filter-rule-1"]                # 该上游数据库实例匹配的表的 binlog event filter 规则名称
   block-allow-list:  "single-rule"                 # 该上游数据库实例匹配的表的 block-allow-list 过滤规则名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list

   syncer-config-name: "global"            # syncers 配置的名称
  1. 使用同样的任务名,在配置中删除filter-rules,通过stop-taskstart-task修改任务配置
block-allow-list:                    # 定义数据源迁移表的过滤规则,可以定义多个规则。如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
  single-rule:
    do-tables:
    - db-name: "test_db1"
      tbl-name: "*"

# ----------- 实例配置 -----------
mysql-instances:
  -
    source-id: "source-1"           # 对应 source.toml 中的 `source-id`
    block-allow-list:  "single-rule"                 # 该上游数据库实例匹配的表的 block-allow-list 过滤规则名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list
    syncer-config-name: "global"            # syncers 配置的名称
  1. 在上游MySQL执行TRUNCATE TABLE操作
    【看到的非预期行为】
    如图所示,TRUNCATE操作仍旧被过滤掉了

    【期望看到的行为】
    TRUNCATE操作正常同步到下游
    【相关组件及具体版本】
    TiDB版本 5.1.2,DM版本v2.0.6

好像是碰到过,stop-task以后把task id改一下再启动试试:rofl:

但是拉取上游的binlog位置信息,是保存在和task_id相对应的下游TiDB里,如果改了task_id,checkpoint就没了吧?

难道直接把下游的元数据表也跟着RENAME一下?不过这么操作就太丑陋了。。
应该有正确的方法来改的吧?

truncate 语句是内置屏蔽的。有什么场景会需要把 truncate 同步下去吗,我们会考虑在后续版本优化

线上有类似缓存的场景,每隔一段时间计算出一个中间结果,然后对外展示。会用truncate来先清空表,然后插入最新数据

2 个赞

有什么办法可以让强制把truncate给同步下去么?

create 、drop 应该可以,你拆分一下, 先创建个临时表t1_tmp把数据插入进去,然后
rename table t1 to t1_bak, t1_tmp to t1;
drop table t1_bak;

额,这种得业务改代码逻辑,不太友好。是这个过滤是内置的,没办法通过调整DM任务配置来忽略么?

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。