首批通过分布式安全可靠测评,为关键业务系统打造
500 租户内存超限 sqlsession 模块内存堆积
更新时间:2026-05-07 09:46
问题描述
执行了一条大查询语句,查询语句中使用了 DBMS_RANDOM 包,该 SQL 平均需要返回 300w 的数据,这条 SQL 执行会触发 package 变量序列化,序列化采用的 allocator 生命周期很长,同时,这条 SQL 执行时间长(2 个小时超时退出),导致内存不断堆积,一直到 SQL 执行完,断开 session 连接,堆积的内存才释放。500 租户内存超限,排查发现 sqlsession 模块导致的,当前模块的内存处于持续增长状态。
查看 500 租户 OBServer 日志中 Memory 的信息。

memleak 信息。

适用版本
OceanBase 数据库企业版 V2.2.x 版本 和 V3.1.x 版本。
OceanBase 数据库企业版 V3.2.3 BP8 (oceanbase-3.2.3.3-108000062023041511) 之前版本。
OceanBase 数据库企业版 V3.2.4 BP3 (oceanbase-3.2.4.3-103000032023041816) 之前版本。
OceanBase 数据库企业版 V4.1.0 BP1 (oceanbase-4.1.0.0-101000052023050621) 之前版本。
问题原因
package 变量序列化时, 采用的 allocator 生命周期很长,如果频繁触发 package 序列化,在 allcator 释放内存前,会出现内存堆积的情况。
解决方法
解决方法
升级至问题已修复版本。
目前已修复的版本包括 OceanBase 数据库企业版 V3.2.3 BP8 (oceanbase-3.2.3.3-108000062023041511) 及之后版本、V3.2.4 BP3 (oceanbase-3.2.4.3-103000032023041816) 及之后版本、V4.1.0 BP1 (oceanbase-4.1.0.0-101000052023050621) 及之后版本。
规避方式
一般存储过程中不会频繁触发 package 变量序列化动作,通常 SQL 语句触发 UDF 时,数据量大的情况下,会频繁触发序列化动作。尽量避免出现这种情况,如果业务必须使用,建议对应 SQL 执行完成后,断开连接,起新 session 继续处理下一个业务。
应急方法
业务 SQL 执行完断开 session,或者内存堆积过大时,重建对应 package,触发 schema version 推高,OceanBase 数据库侧会更新 package 信息,释放内存。