首批通过分布式安全可靠测评,为关键业务系统打造
500 租户 DEFAULT_CTX_ID hold 内存过多
更新时间:2026-05-07 09:46
问题现象
500 租户启动后,内存不断上涨,直至内存不足。
关键诊断信息
触发条件
in expr 中参数大于 128 个。
问题原因
该问题是由 IN 表达式的 query range 优化引入的。具体原因如下:
对 in expr 抽取 query range 时,in expr 中的参数存放在 searray 中。参数个数小于 128 时,in expr 中的参数对象是由优化器的 allocator 分配的,query range 的抽取完成后,会将该 allocator 分配的内存全部释放掉,所以参数个数小于 128 时是没有问题的。当参数个数大于 128 个时,会触发 searray 的扩容,扩容时采用的是 searray 内部的 allocator,由内部 allocator 分配的内存未被释放掉,导致内存不断上涨。
问题的风险及影响
导致内存上涨。
影响租户
影响 OceanBase 数据库中的 Oracle 租户和 MySQL 租户,对于 SYS 租户无影响。
影响版本
OceanBase 数据库企业版 V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本。
解决方法
升级到问题已修复版本。目前已修复的版本包含 OceanBase 数据库企业版 V3.2.3 BP6 Hotfix1(oceanbase-3.2.3.3-106010052022120116)版本、V3.2.3 BP6 Hotfix2(oceanbase-3.2.3.3-106020042022120915)版本、V3.2.3 BP6 Hotfix3(oceanbase-3.2.3.3-106030012022121311)版本、V3.2.3 BP6 Hotfix4(oceanbase-3.2.3.3-106040022022122222)版本、V3.2.3 BP6 Hotfix5(oceanbase-3.2.3.3-106050012023051617)版本、V3.2.3 BP7(oceanbase-3.2.3.3-107000092023011911)及之后版本。
增加析构函数,当
query range的抽取完成后,在析构处手动调用searray的reset函数,将内存释放掉。
规避方式
使用老引擎:
alter system set _enable_static_typing_engine = false;。警告
调整隐藏配置项
_enable_static_typing_engine = false有一定的风险,请勿在生产库上自行调整,请联系咨询 OceanBase 技术支持团队获得帮助。改 SQL:将单个
in expr拆分成多个or形式连接的in expr,使其参数个数小于 128。重启 server。