首批通过分布式安全可靠测评,为关键业务系统打造
V3.2.X 版本开启 “死锁检测” 后 schema 刷新可能导致租户 hang 死
更新时间:2026-06-08 02:36
问题现象
在问题版本 OceanBase 数据库中,如果主动开启了 “死锁检测” 功能(黑屏中使用 set _lcl_op_interval = xxx 开启;OCP 中通过 集群 > 概览 > 开启死锁自动检测 开启),可能会影响 Schema 刷新,进而表现出业务请求执行时间长、业务请求 Hang 住、业务获取不到连接池等异常。
问题原因
OceanBase 数据库从 V3.2 版本开始,引入了主动检测死锁功能。该功能初期实现时存在一个 BUG:死锁检测打开后,如果遭遇锁冲突,将导致 Session 被 Revert 多次,进而导致 Session 在退出时无法归还引用计数,从而造成 Session 泄漏。
在 OceanBase 数据库的 Schema 管理实现中,OceanBase 数据库会将不同版本的 Schema 持有在长为 128 的槽位中。当用户请求访问某版本的 Schema 时,会从槽位上拿到相应 Schema 的引用,待该请求完成后再归还引用。待槽位上某版本的 Schema 没有引用时(即该版本 Schema 涉及的所有请求均已完成),该版本 Schema 才会从槽位上释放。然而,在问题版本中,含有业务请求的每个 Session 均会缓存一个相应版本 Schema 的引用,一旦 Session 泄漏,就会导致相应版本的 Schema 不能从槽位上释放。一旦有较多 “Schema 卡死在槽位上”,就可能会引发 Schema 刷新异常,进而产生各种系统性问题,如:MemTable 长时间不释放、无法转储、无法 GC、业务请求 Hang 住、业务无法从连接池获取连接等异常。
问题的风险及影响
OBServer schema 刷新异常、业务请求 hang 死。
影响的版本
OceanBase 数据库 V3.2.3 BP3 (oceanbase-3.2.3.0-20220622171245) 之前的版本。
注意
- “死锁检测” 功能在 OceanBase 数据库 V3.2.3、V3.2.4 中默认关闭,且不推荐上生产环境。
- OceanBase 数据库 V4.x 版本默认打开。
解决方法
解决方法:
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V3.2.3 BP3 (oceanbase-3.2.3.0-20220622171245) 及之后版本。
问题发生后关闭死锁检测、重启集群来应急。
规避方式
关闭死锁检测功能,具体请参考文档 关闭死锁自动检测。
通过 OBClient 黑屏客户端,在系统用户下关闭死锁检测。
obclient > ALTER SYSTEM SET _lcl_op_interval='0ms';