ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORA-04031的诊断和解决

ORA-04031的诊断和解决

原创 Linux操作系统 作者:sanxiagirl 时间:2008-12-26 16:19:09 0 删除 编辑

        今天一个正式环境的库alert日志中有一些如下报错:

Thu Dec 25 14:36:30 2008 Errors in file /u01/product/admin/lhpdm/bdump/lhpdm_cjq0_5274.trc: ORA-00604: error occurred at recursive SQL level 1 ORA-04031: unable to allocate 32 bytes of shared memory ("shared pool","select count(*) from sys.job...","sql area","kglhin: temp")

Thu Dec 25 14:36:30 2008 Errors in file /u01/product/admin/lhpdm/bdump/lhpdm_cjq0_5274.trc: ORA-00604: error occurred at recursive SQL level 2 ORA-04031: unable to allocate 1048 bytes of shared memory ("shared pool","select obj#,type#,ctime,mtim...","Typecheck","kgghteInit")

Thu Dec 25 14:36:30 2008 Errors in file /u01/product/admin/lhpdm/bdump/lhpdm_cjq0_5274.trc: ORA-00604: error occurred at recursive SQL level 2 ORA-04031: unable to allocate 1048 bytes of shared memory ("shared pool","select obj#,type#,ctime,mtim...","Typecheck","kgghteInit")

       借助下面这篇文章的帮助,找到了原因所在,一个开发人员写的程序有死循环,也在这个过程中对SGA的管理有了进一步的了解。

       作者:储爱宏 2007-02-05

     【IT168 专稿】本文目的:提供一个使用简单,一步步的指导去解决ORA-04013错误。

       当任何试图分配一个大的连续的共享池中的内存失败,Oracle首先会刷新掉共享池中所有目前不在使用的对象,然后使得内存块被合并在一起。如果内存块仍然不够满足需求,那么就会出现ORA- 04031错误。这些错误同样可能发生在ASM的实例中。默认的共享池的大小基本能够满足大部分的环境,但是如果遇到ORA-04031错误的时候可能就需要增大。

      当遇到这个错误的时候,往往会出现如下的消息显示:

04031, 00000, "unable to allocate %s bytes of shared memory (\"%s\",\"%s\", \"% s\",\"%s\")"

准备工作: 要解决问题,首先需要了解一下跟共享池相关的实例参数:

 a) SHARED_POOL_SIZE – 该参数指定共享池的大小,以字节为单位。

b) SHARED_POOL_RESERVED_SIZE – 该参数指定为大的连续的共享池内存请求预留的共享池的大小。该参数连 同 SHARED_POOL_RESERVED_MIN_ALLOC参数,可以用于避免消除由于共享池碎片太多导致迫使Oracle搜寻空闲的共享池空间而产生ORA-04031错误。

c) SHARED_POOL_RESERVED_MIN_ALLOC – 该参数用于控制预留内存的分配。大于该参数的内存分配可以使用预留内存的列表。其默认值适合绝大多数的系统,如果增加这个参数值,那么Oracle将允许分配越少的预留内存列表而更多的请求共享池列表。该参数在Oracle8i和之后的版本都是隐含参数,但是可以通过执行如下SQL查到: select nam.ksppinm NAME, val.KSPPSTVL VALUE from x$ksppi nam,x$ksppsv val where nam.indx = val.indx and nam.ksppinm like '%shared%' order by 1; 对于Oracle10g,具有自动内存管理的新特性,允许DBA保留用于分配给Oracle内存区域使用的共享内存。通常来说,当Oracle需要分配一个大对象到共享池中却无法找到一段连续可用的内存空间时,Oracle10g将会从其他SGA结构中使用自由内存来自动增大共享池的大小。自从10g数据库中内存空间分配被Oracle自动管理之后,出现ORA-04013错误的可能性大大降低了,当SGA_TARGET参数大于0的时候,就启用了自动内存管理特性,当前SGA的设置可以查询视图v$sga_dynamic_components。

诊断工作: 
    
大部分的ORA-4031错误都和共享池大小有关,因此我们诊断这个错误一般都由共享池开始。当然,large_pooljava_pool的内存分配机制比较的简单,一般错误都是由于不够大引起的。由于设置共享池大小不合理或者是共享池碎片太多都会导致Oracle无法找到一个足够大的内存段来容纳数据对象从而产生ORA-04013错误。已经有很多的例子说明对于ASM实例,默认的共享池大小是远远不够的,如果 对于一个ASM实例出现这个错误,首先应该查看共享池大小,如果太小了,增大到不出现错误为止。 
    
不适当的大小:首先决定出现ORA-04031错误的的原因是在library cache中缺乏连续的内存空间,可以通过查询视图   v$SHARED_POOL_RESERVED,满足如下的条件: 
     REQUEST_FAILURES > 0
并且LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC 
     REQUEST_FAILURES=0
并且LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC 
   
如果出现上述情况,可以认为是由于设置了较小的SHARED_POOL_RESERVED_MIN_ALLOC使得数据库把更多的对象放到共享池保留空间中,增大共享池大小可以解决这种问题的出现。
但是如果当使用了多个池的时候, LAST_FAILURE_SIZE会显示错误,会显示出所有池失败大小的总和,这个是个bug3669074,Oracle9.2.0.7,10.1.0.410.2.x版本中被修正。
共享池碎片:
     如果是由于共享池碎片引起的ORA-04031错误,那么需要判断是由于library cache的碎片导致的还是共享池保留空间中的碎片太多导致的,可以用下面的规则来判定: 
     REQUEST_FAILURES>0
并且LAST_FAILURE_SIZE>SHARED_POOL_RESERVED_MIN_ALLOC 
    
要解决这个问题,增大SHARED_POOL_RESERVED_MIN_ALLOC来减少对象被缓存到共享池保留空间中的数量并且增大SHARED_POOL_RESERVED_SIZE SHARED_POOL_SIZE来提高共享池保留空间中有更多可用的内存。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10640532/viewspace-521364/,如需转载,请注明出处,否则将追究法律责任。

下一篇: dbo是什麼
请登录后发表评论 登录
全部评论

注册时间:2008-01-02

  • 博文量
    142
  • 访问量
    507589