首批通过分布式安全可靠测评,为关键业务系统打造
插入数据报 Over tenant memory limits
更新时间:2026-05-08 08:11
问题现象
OceanBase 集群的某个租户,在更新数据时,提示如下错误信息。
ERROR 4030 (HY000): OB4030: Over tenant memory limits
问题原因
该错误信息虽然为 “超过租户内存限制”,但是根因是租户 MemStore 超限。租户 MemStore 超限可以大体分为以下三种原因。
- 如果某单个事务大小乘以 4 超过 MemStore 剩余内存,则会出现错误,此时 MemStore 内存有剩余。
- MemStore 内存超过 memstore limit 的限制,MemStore 无任何剩余内存。
- 由于内存泄漏或非 MemStore 的模块内存占用较大,挤占了 MemStore 部分的内存,MemStore 有剩余内存,但仍报错。
适用版本
OceanBase 数据库 V2.2.77 版本。
解决方法
当您看到上述错误信息时,首先需判断是不是 MemStore 内存超限,当 MemStore 内存超限时,需要检查数据写入是否过量或未做限流。当遇到大量写入且数据转储跟不上写入速度的时候就会报这种错误。运行下述语句查看内存状态。
obclient> SELECT /*+ READ_CONSISTENCY(WEAK),query_timeout(100000000) */ TENANT_ID,IP,
round(ACTIVE/1024/1024/1024,2)ACTIVE_GB,
round(TOTAL/1024/1024/1024,2) TOTAL_GB,
round(FREEZE_TRIGGER/1024/1024/1024,2) FREEZE_TRIGGER_GB,
round(TOTAL/FREEZE_TRIGGER*100,2) percent_trigger,
round(MEM_LIMIT/1024/1024/1024,2) MEM_LIMIT_GB
FROM gv$memstore
WHERE tenant_id >1000 OR TENANT_ID=1
ORDER BY tenant_id,TOTAL_GB DESC;
该问题的紧急应对措施是增加租户内存。问题解决之后需要分析原因,如果是因为未做限流引起,需要加上相应措施,然后回滚之前加上的租户内存动作。如果确实因为业务规模增长导致租户内存不足以支撑业务时,需要根据转储的频度设置合理的租户内存大小。如果 MemStore 内存未超限,运行下述语句判断是哪个内存模块超限。
obclient> SELECT tenant_id,svr_ip,sum(hold) module_sum
FROM __all_virtual_memory_info
WHERE tenant_id>1000 AND hold<>0 AND
mod_name NOT IN ('OB_KVSTORE_CACHE','OB_MEMSTORE')
GROUP BY tenant_id,svr_ip;
内存模块超限的判断标准是 module_sum > (租户 min_memory - 租户 MemStore)。模块内存超限,可能需要先调整单独模块的内存,例如,调整 ob_sql_work_area_percentage 的值,如果租户内存过小,也需要增加租户内存。