0
0
1
0
专栏/.../

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

 db_user  发表于  2023-02-24

一、背景

具体架构上游是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应该设置为431875738828800001
tiup 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来解决

0
0
1
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论