tidb 升级到6.5.0 tidb无法启动,'mysql.tidb_ttl_table_status' doesn't exist"

【 TiDB 使用环境】生产环境
【 TiDB 版本】6.1.2 》 6.5.0
【复现路径】升级版本
【遇到的问题:问题现象及影响】 升级完成后,tidb组件一直无法启动,日志里有[WARN] [job_manager.go:144] [“fail to update table status cache”] [ttl-worker=manager] [error=“[schema:1146]Table ‘mysql.tidb_ttl_table_status’ doesn’t exist”]

【资源配置】
【附件:截图/日志/监控】

问题已解决。原因可能是升级时未清空DDL语句,导致升级过程中mysql表的表结构未升级成功,Tidb就无法正常启动。

解决办法是手动patch一个低版本的tidb,启动一个节点后手动进行表结构同步。完成后将tidb重启即可

1 Like

未清空ddl语句什么意思?

ADMIN SHOW DDL jobs看下是否有未执行完的ddl语句,有的话需要ADMIN CANCEL DDL JOBS job_id取消掉对应的ddl job,否则会锁住mysql表导致升级的时候,mysql相关的表结构语句无法执行成功,例如tidb_ttl_table_status没创建,导致tidb server无法启动

为啥要升级到一个低版本tidb呢?

因为新版本的tidb需要tidb_ttl_table_status表才可以启动,而你因为ddl阻塞没有创建成功,新版本的起不来,只能先启动一个低版本的tidb,把tidb_ttl_table_status表建起来之后,同步到其他节点,然后才能以新版本的tidb启动

“”解决办法是手动patch一个低版本的tidb,启动一个节点后手动进行表结构同步。完成后将tidb重启即可”
这个能具体说一下嘛?
仅启动一个tidb实例就可以吗?因为表结构不是存储在kv实例上吗?那么kv实例需要启动哪些呢?另外这个tidb实例需要是ddl owner节点吗?

就是当前有正在运行中的DDL操作,导致更新的DDL操作被堵塞了

因为升级过程中,表结构未升级成功,新版本的tidb启动不了,只能用上一个版本的tidb启动

当时的现象是tikv都启动完成了,所有的tidb无法启动。我的操作是patch了其中的一个节点,然后缩容了其他的所有tidb(为了避免手动更新的DDL操作转移到故障tidb节点上去)。部署一个简易的同版本的tidb后,使用navicat手动同步mysql表的表结构。最后在把所有的tidb节点扩容,就正常启动了