首批通过分布式安全可靠测评,为关键业务系统打造
add_plan 报错: -5226 plan cache memory used reach limit
更新时间:2026-05-08 08:11
适用版本
OceanBase 数据库 V2.x、V3.x 版本。
问题现象
OCP 告警,错误码=5226, 错误名称=OB_REACH_MEMORY_LIMIT。
OCP 告警通知-单条告警。
名称:OB 日志告警。
级别:严重。
告警对象:ob_cluster=cqrscluster-1637296640:svr_ip=10.xx.xx.xx :ob_error_code=5226 。
概述:[OB 日志告警] cqrscluster-10.xx.xx.xx OB_REACH_MEMORY_LIMIT 。
生成时间:2022-12-19T01:44:46+08:00 。
详情:
[OB 日志告警] 集群=cqrscluster, 机器=10.xx.xx.xx, 错误码=5226, 错误名称=OB_REACH_MEMORY_LIMIT, 错误详情=[2022-12-19 10:51:17.130914] ERROR [SQL.PC] add_plan (ob_plan_cache.cpp:738) [33484][2792][YB420A0A34F8-0005EF81CD5B5EA4] [lt=25] [dc=0] plan cache memory used reach limit(tenant_id=1013, get_mem_hold()=20172505088, get_mem_limit()=19756849560, ret=-5226) BACKTRACE:0xa1fe018 0xa1e24c9 0x2c2f311 0x2c515d5 0x2ce72f4 0x2cf4d99 0x9329457 0x8ea7fad 0x2b55c3a 0x292181f 0x2921033 0x29105c7 0x290dd19 0x2909506 0x2907313 0x2902524 0x748e46a 0x32648f7 0xa00f666 0xa00c94f 0xa007f7e
问题原因
短时间内的 SQL 过多,来不及淘汰老的 Plan Cache,生成的计划无法加入缓存中。
解决方法
应用侧的 SQL 编写要标准化,尽量在程序中对同一条 SQL 使用相同的格式,在参数化后可以统一为一条 SQL。
数据库侧调大 Plan Cache 的内存上限。
调整计划缓存百分比
ob_plan_cache_percentage参数 5 调整到 10。obclient> set global ob_plan_cache_percentage=10;ob_plan_cache_percentage用于设置计划缓存可使用内存占租户内存的百分比。属性 描述 参数类型 int 默认值 5 取值范围 [0, 100] 生效范围 GLOBAL 是否参与序列化 是 计划缓存最多可使用内存(内存上限绝对值)= 租户内存上限 * ob_plan_cache_percentage/100。