EAS报错ORA-04031如何处理?
金蝶云社区-马瑞琪
马瑞琪
0人赞赏了该文章 1,201次浏览 未经作者许可,禁止转载编辑于2015年07月14日 17:21:27
适用版本EAS750、EAS800问题描述EAS的数据库参数SGA_TARGET设置不合理导致报错ORA-04031,导致发生内存溢出,数据库实例hang住,业务中断,影响生产。

数据库alert日志报错:

解决方案原因分析:原因一: sga过小,进而sharepool设置过小,导致数据库使用内存不足解决方法:修改sga_target的参数,增加sga大小 原因二:• Oracle从9i开始,根据sharedpool的大小将sharedpool分为多个子池(subpool),每个子池有独立的free list,同时在分配时单独管理(有其独立 的shared pool latch)。Oracle的BUG或者说是内存分配策略缺陷导致某一类shared pool的内存分配只在一个子池(subpool)中,即多个子池的使用极不均衡,导致向那个使用得最多的子池申请内存时失败。报错信息中的”sga heap(5,1)”即指明是在第5个子池申请内存时失败。解决方法:减少share pool子池数量原因一:修改sga_target的参数,增加sga大小步骤一:评估合适的sga要设置的大小关于SGA、PGA与系统内存三者间的关联,目前有一个相对通用的计算规则可供参考:对于OLTP数据库,SGA=系统内存*70%*80%,PGA=SGA*(10%~20%)。SGA=系统内存*0.56PGA=系统内存*(0.05~0.1)对于OLAP数据库,SGA=系统内存*80%*60%,PGA=SGA*(45%~65%)。SGA=系统内存*0.48PGA=系统内存*(0.22~0.31)(对于32bit平台,默认情况下SGA最大可用内存有1.7GB的限制)步骤二:用下面的sql增加参数SQL>ALTER SYSTEM SET SGA_TARGET =xxxm SCOPE = SPFILE;步骤三:重启数据库,使参数生效Shutdown immediateStart up步骤四:查看参数是否生效Showparameter SGA_TARGET 步骤五:修改完成之后,数据库正常运行一段时间,然后可以在alter里面查看是否还存在ORA-04031: 无法分配 760 字节的共享内存 ("shared pool","unknownobject","kglss","kgllc")此类报错信息。如果已经没有,说明问题解决。 原因二:减少share pool的子池大小步骤一:通过以下脚本确认一下subpool个数: SELECT A.KSPPINM,B.KSPPSTVL FROM X$KSPPI A, X$KSPPSV B WHERE A.INDX = B.INDX AND A.KSPPINM = '_kghdsidx_count';步骤二:针对以上查出的subpool个数及报错所需的sharedmemory数情况,我们可以相应减少SharedPool子池的数量,以使得每个子池可以有足够的空闲内存可用。在这个客户环境中,如果 kghdsidx_count为10, 首先将_kghdsidx_count调整为8,每个子池的内存进行扩大。(建议在测试数据库上先测试后再运用到生产数据库上) 设置方法如下所示:(1).停所有eas实例;(2). Sqlplus / as sysdbaSql> alter system set"_kghdsidx_count"=8 scope=spfile; (3).重启数据库(4).启所有eas实例关键字 ORA-04031 ORACLE数据库hang住

1.png(18.31KB)

2.png(21.62KB)