ORA-04031错误导致shared_pool问题

环境描述:

数据库版本:Oracle 11.2.0.1

操作系统:AIX 7.1

物理内存:64G

双节点 RAC

发生故障现象:客户端无法连接数据库,数据库无响应

检查报警日志为如下错误信息:

Sun Aug 20 06:00:22 2017
Errors in file /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/trace/DSPDB1_dbrm_12583066.trc  (incident=5404
47):
ORA-04031: unable to allocate 4200 bytes of shared memory ("shared pool","unknown object","KGSKI sche
dule","KGKP classinst")
Incident details in: /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/incident/incdir_540447/DSPDB1_dbrm_12583
066_i540447.trc
Sun Aug 20 06:00:24 2017
Errors in file /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/trace/DSPDB1_ora_7405642.trc  (incident=540855
):
ORA-04031: unable to allocate 2944 bytes of shared memory ("shared pool","unknown object","sga heap(2
,1)","KGLHD")
Incident details in: /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/incident/incdir_540855/DSPDB1_ora_7405642_i540855.trc
Sun Aug 20 06:00:24 2017
Trace dumping is performing id=[cdmp_20170820060024]
Errors in file /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/trace/DSPDB1_dbrm_12583066.trc:
ORA-04031: unable to allocate 4200 bytes of shared memory ("shared pool","unknown object","KGSKI sche
dule","KGKP classinst")
Sun Aug 20 06:00:25 2017
Errors in file /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/trace/DSPDB1_gen0_12256234.trc  (incident=5404
31):
ORA-04031: unable to allocate  bytes of shared memory ("","","","")
Incident details in: /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/incident/incdir_540431/DSPDB1_gen0_12256
234_i540431.trc
Sun Aug 20 06:00:26 2017
Sweep [inc][540855]: completed
Sweep [inc][540447]: completed
Sweep [inc][540431]: completed
Sweep [inc2][540855]: completed
Sweep [inc2][540447]: completed?

问题分析:

这是Oracle 对这个报错的解释:

oerr ORA 4031
04031, 00000, "unable to allocate %s bytes of shared memory (\"%s\",\"%s\",\"%s\",\"%s\")"
// *Cause:  More shared memory is needed than was allocated in the shared
//          pool or Streams pool.
// *Action: If the shared pool is out of memory, either use the
//          DBMS_SHARED_POOL package to pin large packages,
//          reduce your use of shared memory, or increase the amount of
//          available shared memory by increasing the value of the
//          initialization parameters SHARED_POOL_RESERVED_SIZE and
//          SHARED_POOL_SIZE.
//          If the large pool is out of memory, increase the initialization
//          parameter LARGE_POOL_SIZE.
//          If the error is issued from an Oracle Streams or XStream process,
//          increase the initialization parameter STREAMS_POOL_SIZE or increase
//          the capture or apply parameter MAX_SGA_SIZE.

引起这个报错的原因一般情况下有如下原因:

  1. 内存中有大量碎片,导致在分配内存的时候,没有连续的内存可存放,这个问题需要在开发上着手,增加绑定变量,减少硬解析。
  2. 要么就是内存不足,需要扩大内存。

我查过发生这个问题前到发生这个报错的AWR报告:

数据库内存占用率不到60%,所以不太可能由于内存不足造成,加上发生故障是早上6:00左右,是业务非高峰时间

以下是显示软解析81.03%,表明硬解析比较多,所以增加绑定量减少硬解析的

共享池锁争用等待事件比较严重

使用以下命令查出没有绑定变量的SQL语句有309个。

SET pages 10000
SET linesize 250
column FORCE_MATCHING_SIGNATURE format 99999999999999999999999
WITH c AS
     (SELECT  FORCE_MATCHING_SIGNATURE,
              COUNT(*) cnt
     FROM     v$sqlarea
     WHERE    FORCE_MATCHING_SIGNATURE!=0
     GROUP BY FORCE_MATCHING_SIGNATURE
     HAVING   COUNT(*) > 20
     )
     ,
     sq AS
     (SELECT  sql_text                ,
              FORCE_MATCHING_SIGNATURE,
              row_number() over (partition BY FORCE_MATCHING_SIGNATURE ORDER BY sql_id DESC) p
     FROM     v$sqlarea s
     WHERE    FORCE_MATCHING_SIGNATURE IN
              (SELECT FORCE_MATCHING_SIGNATURE
              FROM    c
              )
     )
SELECT   sq.sql_text                ,
         sq.FORCE_MATCHING_SIGNATURE,
         c.cnt "unshared count"
FROM     c,
         sq
WHERE    sq.FORCE_MATCHING_SIGNATURE=c.FORCE_MATCHING_SIGNATURE
AND      sq.p                       =1
ORDER BY c.cnt DESC;?

解决方案:

修改SQL增加绑定变量,减少硬解析,避免共享池锁争用,在内存自动管理的模式下,硬解析太多会导致内存抖动。

紧急处理:重启实例

参考博客:http://www.laoxiong.net/an-ora-04031-case.html

时间: 2024-12-25 19:07:15

ORA-04031错误导致shared_pool问题的相关文章

修改DNS域名转发器解决IP地址解析错误导致的网站不能访问

修改DNS域名转发器解决IP地址解析错误导致的网站不能访问 首先谢谢同事林路的指导,才能顺利解决问题 打开网站,访问一个域名,DNS解析到错误的IP地址,那么将不能正确访问该网站 1.使用8.8.8.8(google 公用dns定位本地dns解析和google解析),这里是zh.wikipedia.org ping zh.wikipedia.org     159.106.121.75(这个是很多dns异常解析的地址) nslookup -qt zh.wikipedia.org 8.8.8.8

mysql连接错误导致用户blocked

1.每过一段时间线上业务就会出现如下错误: kHost 'XXXXX' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'Connection closed by foreign host 2.需要使用mysqladmin flush-hosts解锁用户 3.查看错误日志 4.查看官方文档对max_connect_errors的解释如下     当某用户连续的错误连接达到max_c

eclipse启动tomcat,突然出现 fail to start错误,导致不能启动

尝试了 1.重新安装tomcat 2.重新在eclipse中配置tomcat服务器 都没能解决 ===================================== 最后看了一个外文的问答页,其中一个回答让仔细检查web.xml文件 肉眼还是看不出什么问题,但是把最后配置的一个servlet重新配一下就好了 注意:在配置web.xml的时候要按照xml的约束规则 排列各个标签的出现顺序 eclipse启动tomcat,突然出现 fail to start错误,导致不能启动,布布扣,bubu

gcc参数-l传递顺序错误导致`undefined reference'的一点小结

刚才编译一个pthread的单文件程序, 使用的命令行是: gcc -o thread1 -lpthread thread1.c 结果报错: 1 $ gcc -o thread1 -lpthread thread1.c 2 /tmp/ccNqs6Bh.o: In function `main': 3 thread1.c:(.text+0x49): undefined reference to `pthread_create' 4 thread1.c:(.text+0x5f): undefined

Eclipse错误导致无法启动The workspace exited with unsaved changes in the previous session

MyOpenSUSE:/home/jin/workspace # tail -f .metadata/.log !SESSION 2014-05-04 11:35:58.869 -----------------------------------------------eclipse.buildId=4.3.2.M20140221-1700java.version=1.7.0_51java.vendor=Oracle CorporationBootLoader constants: OS=li

Linux在fstab中因配置错误导致服务器主机无法重启的问题应该如何解决

fstab中配置错误导致系统无法启动的恢复方案 1制造错误的案例发生,在/etc/fstab中配置如下内容 结尾的倒数第一个为1表示进行磁盘检查,为0表示不进行磁盘检查,倒数第二个为0表示不备份,为1表示进行备份,一般除了/boot 和 / 使用磁盘检查,其余的都不使用磁盘检查.备份自己去备份,没必要让系统去帮你备份. 重启服务器主机,在启动过程中就会报错 2处理错误 上面的错误提示我们给出root密码或者使用Ctrl+D继续,但是Ctrl+D还是会重启,所以我们给出root密码进行处理. 给出

网关配置错误导致Outlook无法连线

最近碰到一个Outlook 无法连接的问题,经过反复研究,最后发现是网关错误导致,下面将排错方法和过程分享给大家! 环境介绍:服务器Exchange 2010,用户端:Win7+Office2010,Win10+Office2016,内网用户通过Outlook以Exchange Client方式连接到Exchange 2010,同一网络,用户禁止访问Internet,之前一直工作正常! 问题描述:突然有一天,接用户报障:Win10+Office2016用户, Outlook无法工作,显示断线,无

xcode5 asset catalogs 由于图标尺寸错误导致编译问题解决[原创]

如下图,即使图片尺寸不规范,xcode5也可以正常预览(这里我提供的尺寸是57*57, 而需要的是120*120) 但编译运行失败,报的错是: Images.xcassets: error: The app icon set named "AppIcon" did not have any applicable content. Images.xcassets:./AppIcon.appiconset/[iphone][60x60][2x]: warning: AppIcon.appi

关于oracle 11g导出数据时 报 ORA 1455错误的处理

由于导出的该用户的表可能存在空数据表,那么可能就会出现此其异常. 首先: 查看: SQL>show parameter deferred_segment_creation; 如果为TRUE,则将该参数改为FALSE: 在sqlplus中,执行如下命令: SQL>alter system set deferred_segment_creation=false; 然后: 可以针对数据表.索引.物化视图等手工分配Extent SQL>Select 'alter table '||table_n