---
title: "常见内存问题 | OceanBase 文档中心"
description: "常见内存问题 问题一：超过租户内存限制怎么办？ ERROR 4030 (HY000): OB-4030:Over tenant memory limits 。 当您看到上述错误信息时，首先需判断是不是 MemStore 内存超限，当 MemStore 内存超限时，需要检查数据写入是否过量或未做限流。当遇到大量写入且数…"
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 3.2.3 企业版 LTS

# 常见内存问题

更新时间：2023-07-18 17:25:59

## 问题一：超过租户内存限制怎么办？

`ERROR 4030 (HY000): OB-4030:Over tenant memory limits`。

当您看到上述错误信息时，首先需判断是不是 MemStore 内存超限，当 MemStore 内存超限时，需要检查数据写入是否过量或未做限流。当遇到大量写入且数据转储跟不上写入速度的时候就会报这种错误。系统租户下运行下述语句查看当前内存使用情况：

```sql
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 oceanbase.gv$memstore
WHERE tenant_id >1000 OR TENANT_ID=1
ORDER BY tenant_id,TOTAL_GB DESC;

```

该问题的紧急处理措施是增加租户内存，具体操作请咨询技术支持人员。问题解决之后需要分析原因，如果是因为未做限流引起，需要加上相应措施，然后回滚之前加上的租户内存动作；如果确实因为业务规模增长导致租户内存不足以支撑业务时，需要根据转储的频度设置合理的租户内存大小；如果 MemStore 内存未超限，运行下述语句判断是哪个内存模块超限：

```sql
obclient> SELECT tenant_id,svr_ip,sum(hold) module_sum
FROM oceanbase.__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` 的值，如果租户内存过小，也需要增加租户内存。

| 系统变量名 | 描述 | 默认值 | 生效范围 |
| --- | --- | --- | --- |
| `ob_sql_work_area_percentage` | 租户工作区内存，是 SQL 排序等阻塞性算子使用的内存。 | 5% | Global |

## 问题二：PLANCACHE 命中率低于 90% 怎么办？

如果是 OLTP 系统 PLANCACHE 命中率应不低于 90%，运行下述语句查看 PLANCACHE 命中率：

```sql
obclient> SELECT hit_count,executions,(hit_count/executions) as hit_ratio
FROM oceanbase.v$plan_cache_plan_stat
WHERE (hit_count/executions) < 0.9;

obclient> SELECT hit_count,executions,(hit_count/executions) AS hit_ratio
FROM oceanbase.v$plan_cache_plan_stat
WHERE (hit_count/executions) < 0.9 AND executions > 1000;

```

寻找是否有相似语句，例如 `in` 或 `not in` 后面的参数个数随机，导致大量浪费；如果不是上述情况，可能是因为业务量或会话激增导致内存不足，需要调整租户内存大小。

## 问题三：日志中有 fail to allocate memory 或 allocate memory fail 等信息怎么办？

日志中会包含 `tenant_id` （租户编号）及 `mod_id` （内存模块编号）信息，可以通过以下语句查询具体的内存模块信息：

```sql
obclient> SELECT * FROM oceanbase.__all_virtual_memory_info WHERE mod_id=xxx AND tenant_id = xxx

```

从问题一中可知，如果模块内存超限，需要先调整单独模块的内存。如果租户内容过小，需要增加租户内存。具体操作请咨询技术支持人员。

## 问题四：500 租户内存超限

`tenant_id =500` 的租户是 OB 内部租户，简称 500 租户。正常情况下，该报错会多次出现，最可能是机器系统内存被耗光或当前机器剩余内存已被预分配，用户无法再扩展。

这种报错需要查看内存被占用情况，500 租户的内存使用量没有被 `v$memory` 和 `gv$memory` 统计，需要查询 `__all_virtual_memory_info` 表，同时排查系统中内存的使用情况。如果是机器系统内存被耗光，判断是否为系统偶发情况。如果是，且同时没有业务影响，可等系统自行释放内存；如果有大的业务影响或系统正常进程活动导致内存被占用以及内存被预分配等情况，可考虑增加内存，具体操作请咨询技术支持人员。

```sql
SELECT * FROM oceanbase.__all_virtual_memory_info WHERE tenant_id=500;
//排查系统内存使用命令

```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
