【 TiDB 使用环境】生产环境
【 TiDB 版本】6.5.1
【复现路径】做过哪些操作出现的问题,
将分区表改为普通表,执行了分区交换,和rename表操作。
ALTER TABLE fulfillorder_part EXCHANGE PARTITION p2023 WITH TABLE fulfillorder_2023;
rename table order_fulfill_data.fulfillorder_2023 to order_fulfill_data.fulfillorder;
【遇到的问题:问题现象及影响】
drainer重启后,提示
[2023/11/17 23:44:29.544 +08:00] [INFO] [schema.go:550] [“Finished dropping column”] [job=“ID:168947, Type:drop column, State:synced, SchemaState:none, SchemaID:167106, TableID:167998, RowCount:0, ArgLen:0, start time: 2023-05-11 15:09:37.05 +0800 CST, Err:, ErrCount:0, SnapshotVersion:0”]
[2023/11/17 23:44:29.544 +08:00] [INFO] [schema.go:550] [“Finished dropping column”] [job=“ID:168948, Type:drop column, State:synced, SchemaState:none, SchemaID:167106, TableID:167998, RowCount:0, ArgLen:0, start time: 2023-05-11 15:09:38.1 +0800 CST, Err:, ErrCount:0, SnapshotVersion:0”]
[2023/11/17 23:44:29.544 +08:00] [INFO] [schema.go:550] [“Finished dropping column”] [job=“ID:168949, Type:drop column, State:synced, SchemaState:none, SchemaID:167106, TableID:167998, RowCount:0, ArgLen:0, start time: 2023-05-11 15:09:39.151 +0800 CST, Err:, ErrCount:0, SnapshotVersion:0”]
[2023/11/17 23:44:29.580 +08:00] [ERROR] [server.go:292] [“syncer exited abnormal”] [error="handlePreviousDDLJobIfNeed failed: handle ddl job ID:189151, Type:rename table, State:synced, SchemaState:public, SchemaID:188443, TableID:188451, RowCount:0, ArgLen:0, start time: 2023-11-17 21:32:27.219 +0800 CST, Err:, ErrCount:0, SnapshotVersion:0 failed, the schema info: {\n\t\t"hasImplicitCol": false,\n\t\t"schemaMetaVersion": 0,\n\t\t"schemaNameToID": {\n\t\t\t"atom-sign-all": 3664,\n\t\t\t"auction_data": 181330,\n\t\t\t"cubeweb_by": 51,\n\t\t\t"daas": 121,\n\t\t\t"daas_crs_portal": 16521,\n\t\t\t"daas_customer":
这个不是转换失败,应该是rename出现了问题
那有什么办法,让drainer跳过呢,下游所有drainer都不好用了
感觉不是下游的问题,这些报错的drainer有过滤,不应该执行这些ddl语句的。另外,下游也是tidb,应该不存在兼容的问题。
这个报错中,没有ts,无法跳过
本质原因是 drainer 根本不支持交换分区,你去模拟一下就可以模拟出来的,
如果遇到交换分区的情况 只能用pitr 代替drainer
大神有什么办法能补救吗?
现在drainer都已经起不来了,重建也不行了
启动不来的原因是因为drainer启动时读所有的历史DDL,请将drainer单独升级(通过patch方式)到6.5.3以上再尝试启动,因为6.5.3改善了DDL的获取方式,见https://github.com/pingcap/tidb-binlog/issues/1137。 升级后drainer采用类似ticdc方式加载ddl,应该能绕过不支持的ddl
drainer 就不支持交换分区
如果你可以保证应用以后不使用交换分区的话,可以尝试下楼上的方法,看能不能跳过历史DDL,如果以后还是使用交换分区的话,这种问题还是会遇到的