业务的日志里面有很多报错 ERROR 4030 (HY000): OB-4030:Over tenant memory limits。

【 使用环境 】生产环境 or 测试环境
生产环境
【 OB or 其他组件 】
【 使用版本 】
ob 4.3.1
【问题描述】清晰明确描述问题

业务的日志里面有很多报错 ERROR 4030 (HY000): OB-4030:Over tenant memory limits。

这是当前线上集群的查询结果,当前是用户查询导致的吗?
mysql> SELECT /*+ READ_CONSISTENCY(WEAK),query_timeout(100000000) / TENANT_ID,SVR_IP,
→ round(ACTIVE_SPAN/1024/1024/1024,2) ACTIVE_GB,
→ round(MEMSTORE_USED/1024/1024/1024,2) TOTAL_GB,
→ round(FREEZE_TRIGGER/1024/1024/1024,2) FREEZE_TRIGGER_GB,
→ round(MEMSTORE_USED/FREEZE_TRIGGER
100,2) percent_trigger,
→ round(MEMSTORE_LIMIT/1024/1024/1024,2) MEM_LIMIT_GB
→ FROM oceanbase.GV$OB_MEMSTORE
→ WHERE tenant_id >1000 OR TENANT_ID=1
→ ORDER BY tenant_id,TOTAL_GB DESC;
±----------±---------------±----------±---------±------------------±----------------±-------------+
| TENANT_ID | SVR_IP | ACTIVE_GB | TOTAL_GB | FREEZE_TRIGGER_GB | percent_trigger | MEM_LIMIT_GB |
±----------±---------------±----------±---------±------------------±----------------±-------------+
| 1002 | 10.xxx.xx.23 | 22.97 | 49.44 | 10.90 | 453.57 | 49.50 |
| 1002 | 10.xxx.xxx.134 | 24.36 | 49.43 | 10.90 | 453.48 | 49.50 |
| 1002 | 10.xxx.xxx.4 | 25.27 | 49.42 | 10.90 | 453.39 | 49.50 |
±----------±---------------±----------±---------±------------------±----------------±-------------+
3 rows in set (0.05 sec)

mysql>
mysql> SELECT tenant_id,svr_ip,hold module_sum
→ FROM oceanbase.GV$OB_MEMORY
1000 AND hold<>0 A → WHERE tenant_id>1000 AND hold<>0 AND
→ CTX_NAME NOT IN ( ‘OB_KVSTORE_CACHE’,‘OB_MEMSTORE’)
→ GROUP BY tenant_id,svr_ip;
±----------±---------------±-----------+
| tenant_id | svr_ip | module_sum |
±----------±---------------±-----------+
| 1002 | 10.xxx.xxx.134 | 1896546304 |
| 1002 | 10.xxx.xx.23 | 1767538688 |
| 1002 | 10.xxx.xxx.4 | 2291892224 |
±----------±---------------±-----------+
3 rows in set (0.04 sec)

【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

您在 OceanBase 4.3.1 生产环境中遇到了 ERROR 4030 (HY000): OB-4030:Over tenant memory limits 错误,这通常表明您的租户内存资源不足。为了进一步排查和解决问题,推荐您使用 obdiag 工具进行日志采集,并且将采集到的日志提供给我们。

日志采集场景: 内存问题
日志采集命令: obdiag gather scene run --scene=observer.memory

该命令会帮助我们收集与内存相关的信息,以便于后续的分析。同时,请您也执行以下 SQL 语句来检查当前的内存使用情况:

obclient> SELECT /*+ READ_CONSISTENCY(WEAK),query_timeout(100000000) */ TENANT_ID,SVR_IP,
round(ACTIVE_SPAN/1024/1024/1024,2) ACTIVE_GB,
round(MEMSTORE_USED/1024/1024/1024,2) TOTAL_GB,
round(FREEZE_TRIGGER/1024/1024/1024,2) FREEZE_TRIGGER_GB,
round(MEMSTORE_USED/FREEZE_TRIGGER*100,2) percent_trigger,
round(MEMSTORE_LIMIT/1024/1024/1024,2) MEM_LIMIT_GB
FROM oceanbase.GV$OB_MEMSTORE
WHERE tenant_id >1000 OR TENANT_ID=1
ORDER BY tenant_id,TOTAL_GB DESC;

obclient> SELECT tenant_id,svr_ip,hold module_sum
FROM oceanbase.GV$OB_MEMORY
WHERE tenant_id>1000 AND hold<>0 AND
CTX_NAME NOT IN ( 'OB_KVSTORE_CACHE','OB_MEMSTORE')
GROUP BY tenant_id,svr_ip;
``

为了更准确地定位问题,请您提供一些额外的信息:
1. 当前租户的内存配置是多少?
2. 是否最近进行了大量的数据写入操作?
3. 您是否尝试过调整租户的内存限制?如果尝试过,请分享具体的调整策略。
4. 业务规模近期是否有显著变化?
5. 您是否已经尝试过增加租户内存作为临时解决方案?

请根据上述指导进行操作,并将 obdiag 采集的日志压缩包发送给我们,以便我们进一步分析。



详情请参考:
1. [常见内存问题](https://github.com/oceanbase/oceanbase-doc/blob/V4.3.1/zh-CN/700.reference/200.system-management/700.memory-management/900.common-memory-problems.md)
2. [4000 ~ 4499](https://github.com/oceanbase/oceanbase-doc/blob/V4.3.1/zh-CN/700.reference/900.error-code/600.error-code-of-mysql-mode/300.4000-4499-of-mysql-mode.md)

附上敏捷诊断工具 [obdiag 使用帮助链接](https://ask.oceanbase.com/t/topic/35605619)

1、##### 查看集群 CPU、内存、磁盘参数配置信息
show parameters where name in (‘memory_limit’,‘memory_limit_percentage’,‘system_memory’,‘log_disk_size’,‘log_disk_percentage’,‘datafile_size’,‘datafile_disk_percentage’);
2、##### 集群 server 级资源分配情况
select zone,concat(SVR_IP,’:’,SVR_PORT) observer,
cpu_capacity_max cpu_total,cpu_assigned_max cpu_assigned,
cpu_capacity-cpu_assigned_max as cpu_free,
round(memory_limit/1024/1024/1024,2) as memory_total,
round((memory_limit-mem_capacity)/1024/1024/1024,2) as system_memory,
round(mem_assigned/1024/1024/1024,2) as mem_assigned,
round((mem_capacity-mem_assigned)/1024/1024/1024,2) as memory_free,
round(log_disk_capacity/1024/1024/1024,2) as log_disk_capacity,
round(log_disk_assigned/1024/1024/1024,2) as log_disk_assigned,
round((log_disk_capacity-log_disk_assigned)/1024/1024/1024,2) as log_disk_free,
round((data_disk_capacity/1024/1024/1024),2) as data_disk,
round((data_disk_in_use/1024/1024/1024),2) as data_disk_used,
round((data_disk_capacity-data_disk_in_use)/1024/1024/1024,2) as data_disk_free
from oceanbase.gv$ob_servers;
3、查看模块内存:
select * from gv$ob_memory where tenant_id in (500,1002) order by used desc limit 20;
4、 常见内存问题
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001050332
5、如果语句执行 报的这个错 处理方案如下

解决方法

可以通过增加租户资源的方式解决。查看 OBServer 的租户信息步骤如下:

  1. 使用 sys 租户登录集群。
  2. 查看租户资源池情况。
SELECT * FROM __all_resource_pool;
  1. 查看租户资源单位情况。
SELECT * FROM __all_unit_config;
  1. 调整租户内存比例。
ALTER resource unit XXX_config max_cpu = x ,min_cpu = x ,max_memory ='xxxG',min_memory= 'xxxG';

6、发一下这个时间的observer.log日志

按照楼上发的排查下,同时麻烦发下observer.log

从你查的信息来看 TOTAL_GB接近MEM_LIMIT_GB的内存 可以扩大租户的内存规格的内存或者转储

这个问题解决了吗?