V8.5.4 tidb panic。报错:runtime error: invalid memory address or nil pointer dereference

【TiDB 使用环境】预发环境

CREATE TABLE `ACT_RU_VARIABLE` (
  `ID_` varchar(64) NOT NULL,
  `REV_` int DEFAULT NULL,
  `TYPE_` varchar(255) NOT NULL,
  `NAME_` varchar(255) NOT NULL,
  `EXECUTION_ID_` varchar(64) DEFAULT NULL,
  `PROC_INST_ID_` varchar(64) DEFAULT NULL,
  `TASK_ID_` varchar(64) DEFAULT NULL,
  `SCOPE_ID_` varchar(255) DEFAULT NULL,
  `SUB_SCOPE_ID_` varchar(255) DEFAULT NULL,
  `SCOPE_TYPE_` varchar(255) DEFAULT NULL,
  `BYTEARRAY_ID_` varchar(64) DEFAULT NULL,
  `DOUBLE_` double DEFAULT NULL,
  `LONG_` bigint DEFAULT NULL,
  `TEXT_` varchar(4000) DEFAULT NULL,
  `TEXT2_` varchar(4000) DEFAULT NULL,
  `META_INFO_` varchar(4000) DEFAULT NULL,
  PRIMARY KEY (`ID_`) /*T![clustered_index] CLUSTERED */,
  KEY `ACT_IDX_RU_VAR_SCOPE_ID_TYPE` (`SCOPE_ID_`,`SCOPE_TYPE_`),
  KEY `ACT_IDX_RU_VAR_SUB_ID_TYPE` (`SUB_SCOPE_ID_`,`SCOPE_TYPE_`),
  KEY `ACT_FK_VAR_BYTEARRAY` (`BYTEARRAY_ID_`),
  KEY `ACT_IDX_VARIABLE_TASK_ID` (`TASK_ID_`),
  KEY `ACT_FK_VAR_EXE` (`EXECUTION_ID_`),
  KEY `ACT_FK_VAR_PROCINST` (`PROC_INST_ID_`),
  CONSTRAINT `ACT_FK_VAR_BYTEARRAY` FOREIGN KEY (`BYTEARRAY_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`),
  CONSTRAINT `ACT_FK_VAR_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`),
  CONSTRAINT `ACT_FK_VAR_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

表的数据量是66万左右

报错:
[2026/01/11 11:59:38.191 +00:00] [Error] [conn.go:1042] [“connection running loop panic”] [conn=677627120] [session_alias=] [lastSQL=“select * from ACT_RU_VARIABLE WHERE TASK_ID_ = ‘2010320694529245184’”] [err=“runtime error: invalid memory address or nil pointer dereference”] [stack="github.com/pingcap/tidb/pkg/server.(*clientConn).Run.func1\n\t/workspace/source/tidb/pkg/server/conn.go

下面两条check语句没有任何数据返回:
ADMIN CHECK TABLE ACT_RU_VARIABLE;
ADMIN CHECK INDEX ACT_RU_VARIABLE ACT_IDX_VARIABLE_TASK_ID;

临时处理方案:
ALTER TABLE ACT_RU_VARIABLE DROP INDEX ACT_IDX_VARIABLE_TASK_ID;
ALTER TABLE ACT_RU_VARIABLE ADD INDEX ACT_IDX_VARIABLE_TASK_ID (TASK_ID_);

1 个赞

用哪个版本的tidb? 之前是否有宕机或oom?

1 个赞

V8.5.4 之前没有OOM

3 个赞

这篇教程很有帮助,关于NULL,TiDB的处理方式是存储计算分离,这点与其他数据库有所不同。 个人经验仅供参考。

2 个赞

解决了

2 个赞

可能是 TiDB v8.5.4 版本中 ACT_IDX_VARIABLE_TASK_ID 索引存在元数据损坏或版本兼容问题,导致查询命中该索引时触发空指针引用(nil pointer dereference)

1 个赞

是版本BUG吗?预计什么时间发版

应该是,索引重建后就好了。

删除并重建该表的 ACT_IDX_VARIABLE_TASK_ID 索引可解决此查询报错问题。

肯能是TiDB 8.2.0 版本的二级索引查询空指针 bug + 索引数据 / 元数据隐性损坏,而非业务代码或表结构错误

可以重建一下索引,或者升级一下版本

嗯, 这样开销最小. 升级啥的比较困难

这篇教程很有帮助,关于NULL,TiDB的处理方式是分布式事务处理,这点与其他数据库有所不同。 以上是我的一些看法。

没看明白这问题跟索引重建有啥关系呢

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