OceanBase 数据库内存有如下常见问题:
工作区(work area)报内存不足
工作区内存
limit = 租户内存 * ob_sql_work_area_percentage(默认5%),如果请求并发量较大,且每个请求占用的工作区内存比较多,可能出现工作区内存不足的报错。经常出现的场景有 union、sort、group by 等。 可以通过适当调大工作区系统变量来规避比如set global ob_sql_work_area_percentage = 10。租户内存不足
客户端报错
"Over tenant memory limits",错误码 4013,租户内存不足。通常需要进一步分析当前内存消耗的情况。 可以通过GV$OB_MEMORY视图,也可通过observer.log中的日志查看是哪个 mod 消耗的内存绝对占比比较大。MemStore 内存用尽
写入的速度大于转储的速度,导致 MemStore 耗尽。比如大量高并发的数据导入,MemStore 的写操作过快,系统未能及时转储,MemStore 就被用完,返回用户报错 4030。 可以通过分析转储速度缓慢瓶颈、尝试提高转储速度,或者是减缓写入速度来减缓、解决这类问题。
OBServer 节点整体内存使用超限
OBServer 节点进程在启动过程中,会根据配置的参数来计算当前进程最大使用的物理内存上限。 如果
memory_limit配置数值,那么 OBServer 节点的内存会直接取memory_limit。如果memory_limit为 0,则会通过物理内存 * memory_limit_percentage来计算得到内存使用上限。 若观察到 OBServer 节点内存使用超限,可以查询_all_virtual_server_stat可以看到实际的 OBServer 节点内的 limit, 然后再次检查memory_limit、memory_limit_percentage这两个参数是否配置正确。 如果还存在内存超限且整体趋势持续增长的情况,那么有可能是遇到了内存泄露的场景,需要联系 OceanBase 数据库技术支持工程师来进行排查解决。




