写点什么

一次不兼容 ddl 导致的 cdc 问题

  • 2023-03-03
    北京
  • 本文字数:1594 字

    阅读完需:约 5 分钟

作者: db_user 原文来源:https://tidb.net/blog/692273f0

一、背景

具体架构上游是 tidb, 经由 cdc 同步到 mysql, 同步出错的原因是因为不支持的 ddl 语句,一共有两个 ddl 同时执行


报错语句:


alter table table_name rename column column_name1 to column_name2
复制代码


以前总能碰到 mysql 的 DDL 在 tidb 上不支持,这种情况下的 DDL 是特别注意的,但是 tidb 用习惯后,没有注意这一点,查了mysql5.7 官网才发现,确实是不支持字段的 rename 操作,可以通过 change column 等来达到效果

二、解决问题

1. 下游执行报错 DDL 语句的变种

alter table table_name change column column_name1 column_name2 varchar(20) not null default 'abc' 
复制代码

2. 查看同步任务

# 注意ctl要根据自己的版本来写,记录查看的tso位置tiup ctl:v4.0.13 cdc changefeed --pd=http://pd_ip:pd_port list# 或者用下面的语句,-s表示显示简略的信息,不加显示全部信息tiup ctl:v4.0.13 cdc changefeed --pd=http://pd_ip:pd_port query [-s] -c changefeed_id
复制代码

3. 删除同步任务

tiup ctl:v4.0.13 cdc changefeed --pd=http://pd_ip:pd_port remove -c changefeed_id
复制代码

4. 创建同步任务

# 重点是--start-ts,假设步骤2查出来的tso是431875738828800000,那么想要跳过失败的ts,这里的start-ts要比失败之处的tso+1,所以这里的start-ts应该设置为431875738828800001tiup ctl:v4.0.13 cdc changefeed create --pd=http://pd_ip:pd_port --sink-uri="mysql://mysql_connect_info/" --changefeed-id="changefeed-id" --start-ts=431875738828800001 --sort-engine="unified" --config=./cdc.yaml
复制代码


小结:这是正常的处理方式,到目前为止第一个 ddl 的错误正常解决,但很快,第二个 ddl 的报错就到了,cdc 再次不能正常同步,这时候再进行一次上面的操作,但是这里就出现了问题,看接下来的处理

三、特殊处理

1. 遇到的问题

1.1 remove 不掉

remove 后用 list 查看发现被 remove 掉的 changefeed 还存在,然后新建的同步业务也不同步,问题类似于tug 论坛里的问题,其现象是已有的这个 issue,还有一些相关的 issue 可以做参考issue1,issue2,issue3

1.2 create 成功后同步状态不更新

这个是因为 remove 后很快就进行 create 导致的,问题和tug 论坛里的问题情况二一样

2. 尝试过的办法

# 1.暂停已经remove的任务,没有变化pause -c changefeed_id# 2.采用force命令remove,没有变化remove -c changefeed_id --force# 3.进入到cli命令行进行remove,没有变化# 4.重启cdc,没有变化restart/reload -R cdc# 5.通过curl来删除,报找不到任务,以此推断changefeed_id已经被删除,但是还没有完全清除,存在etcd中,导致的list中还存在curl -X DELETE http://127.0.0.1:8300/api/v1/changefeeds/changefeed_id# 6.等,其实这是最没技术含量的方式,我等了将近20分钟后,发现list后任务已经正常删除了
# 7.不安全的方式,重点,这个方式不要随便使用,尽量不要在正式环境上使用,因为这个命令会清理所有changfeed的信息tiup cdc:v4.0.13 cli --pd=pd_host:pd_port unsafe reset
复制代码

3. 最终解决方案

如果不着急可以先等一段时间,半个小时左右,(在这期间可以调大上游的 gc 时间,以免等待时间过长,超过了 gc 时间,导致丢数据的情况),再进行 list, 发现 remove 信息没有后即可正常进行接下来操作


# 预留足够的时间给cdc同步update mysql.tidb set VARIABLE_VALUE="24h" where VARIABLE_NAME="tikv_gc_life_time";
复制代码


如果很着急且等了一段时间后都没有反应,则可以进行 unsafe reset, 不过要记录下所有任务的信息,以防万一,这一步操作之后所有的 changefeed 都需要重建


tiup cdc:v4.0.13 cli --pd=pd_host:pd_port unsafe reset
复制代码

4. 监控的问题

在正式下线任务的时候,会收到已经下线的 cdc 任务的报警, 这也是低版本 cdc 的一个 bug, 如果不升级的话,遇到的时候可以通过 reload cdc 来解决


发布于: 刚刚阅读数: 1
用户头像

TiDB 社区官网:https://tidb.net/ 2021-12-15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
一次不兼容ddl导致的cdc问题_故障排查/诊断_TiDB 社区干货传送门_InfoQ写作社区