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 个赞

未清空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节点扩容,就正常启动了

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

最近处理了一些 case,低版本升级到 6.5.x 以上版本,tidb 无法启动,报错 Table ‘mysql.tidb_ttl_table_status’ doesn’t exist

可能有几种情况:

第一种情况:

  • 就像上面版主提到的,升级前需要检查好,不能有未完成的 DDL 执行。升级期间也不建议执行 ddl,可能会出现未知的问题。

第二种情况:

第三种情况:

  • 集群中如果存在多个 tidb-server,升级过程中也可能出现卡住的问题,升级到 6.5 时会新建视图 tidb_mdl_view,多个 tidb 并发执行 create view ddl 可能导致的 https://github.com/pingcap/tidb/issues/40352

  • workaround:启动 tidb 集群时指定 --role 先启动 pd 和 tikv,最后指定 --node 依次启动 tidb server
    或者升级前缩容 tidb-server 至 1 个

2 个赞

:smiling_face_with_three_hearts: :smiling_face_with_three_hearts: :smiling_face_with_three_hearts: