1. ERROR 4030 (HY000): OB-4030:Over tenant memory limits 单用户租户。

    当您看到上述错误信息时,首先需判断是不是 MemStore 内存超限,当 MmeStore 内存超限时,需要检查数据写入是否过量或未做限流。当遇到大量写入且数据转储跟不上写入速度的时候就会报这种错误。运行下述语句查看内存状态:

    1. select /*+ READ_CONSISTENCY(WEAK),query_timeout(100000000) */ TENANT_ID,IP,
    2. round(ACTIVE/1024/1024/1024,2)ACTIVE_GB,
    3. round(TOTAL/1024/1024/1024,2) TOTAL_GB,
    4. round(FREEZE_TRIGGER/1024/1024/1024,2) FREEZE_TRIGGER_GB,
    5. round(TOTAL/FREEZE_TRIGGER*100,2) percent_trigger,
    6. round(MEM_LIMIT/1024/1024/1024,2) MEM_LIMIT_GB
    7. from gv$memstore
    8. where tenant_id >1000 or TENANT_ID=1
    9. order by tenant_id,TOTAL_GB desc;

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

    1. select tenant_id,svr_ip,sum(hold) module_sum
    2. from __all_virtual_memory_info
    3. where tenant_id>1000 and hold<>0 and
    4. mod_name not in ( 'OB_KVSTORE_CACHE','OB_MEMSTORE')
    5. group by tenant_id,svr_ip;

    内存模块超限的判断标准是: module_sum > 租户 min_memory - 租户 MemStore。模块内存超限,可能需要先调整单独模块的内存,如 ob_sql_work_area_percentage (排序)和 ob_interm_result_mem_limit (分布式中间结果),如果租户内存过小,也需要加租户内存。

    1. PLANCACHE 命中率低于 90%。

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

    1. select hit_count,executions,(hit_count/executions) as hit_ratio
    2. from v$plan_cache_plan_stat
    3. where (hit_count/executions) < 0.9;
    4. select hit_count,executions,(hit_count/executions) as hit_ratio
    5. from v$plan_cache_plan_stat
    6. where (hit_count/executions) < 0.9 and executions > 1000;

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

    1. 日志中有 fail to alloc memoryallocate memory fail 等错误信息。

    日志中会包含 tenant_id (租户编号)及 mod_id (内存模块编号)信息,可以通过以下语句查询具体的内存模块信息:

    1. select * from __all_virtual_memory_info where mod_id=xxx and tenant_id = xxx;

    如第一个常见内存问题中所述,模块内存超限,可能需要先调整单独模块的内存。如果租户内存过小,也需要加租户内存。