ORA04031 错误

2011年1月14日

     先把数据库的机子介绍下:aix5

                   Host Mem (MB):                   7,936.0(4个cpu)

                   SGA use (MB):                    4,144.0

                   PGA use (MB):                    49.4

             % Host Mem used for SGA+PGA:  52.8                 
              Shared Pool Size(MB):      320

    这两天想看看数据库为什么性能差的问题,通过stackpack报告,查看了一些相关参数后,将Shared Pool Size改为800m,之后运行其存储过程老是提示:

“ORA 4031: unable to allocate %s bytes of shared memory (%s,%s,%s)”的错误。

    将监听配置改成专用服务器连接后(原来为共享服务器)即在监听配置上加上(SERVER = DEDICATED) ,程序执行没有报错。

    后来我又改为用共享服务器连接,将共享池大小改回320m,也没再报这个错。

但是原因是什么呢?

为什么我设置SHARED_POOL_SIZE为320,但是v$sgainfo视图中的SHARED_POOL_SIZE为624?

 我看网上搜到关于这个错误的原因都是解释说关于
SHARED_POOL_SIZE共享池大小是不是不够,或者
SHARED_POOL_RESERVED_SIZE参数与SHARED_POOL_RESERVED_MIN_ALLOC参数值不对(一般为SHARED_POOL_SIZE的10%)

 以下为网上搜的解决该错误的方法:

      ORA-04031 错误通常是因为库高速缓冲中或共享池保留空间中的碎片。 在加大共享池大小的时候考虑调整应用使用共享的SQL 并且调整如下的参数:
                 SHARED_POOL_SIZE,
                 SHARED_POOL_RESERVED_SIZE,
                 SHARED_POOL_RESERVED_MIN_ALLOC.
    首先判定是否ORA-04031 错误是由共享池保留空间中的库高速缓冲的碎片产生的。提交下的查询:
       SELECT free_space, avg_free_size,used_space,avg_used_size,request_failures, last_failure_size FROM v$shared_pool_reserved;
    如果:REQUEST_FAILURES > 0 并且LAST_FAILURE_SIZE > SHARED_POOL_RESERVED_MIN_ALLOC
       那么ORA-04031 错误就是因为共享池保留空间缺少连续空间所致。
       要解决这个问题,可以考虑加大SHARED_POOL_RESERVED_MIN_ALLOC 来降低缓冲进共享池保留空间的对象数目,并增大 SHARED_POOL_RESERVED_SIZE 和SHARED_POOL_SIZE 来加大共享池保留空间的可用内存。  
      如果:REQUEST_FAILURES > 0 并且LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC
或者REQUEST_FAILURES 等于0 并且LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC
     那么是因为在库高速缓冲缺少连续空间导致ORA-04031 错误  
     第一步应该考虑降低SHARED_POOL_RESERVED_MIN_ALLOC 以放入更多的对象到共享池保留空间中并且加大SHARED_POOL_SIZE。


   

原文地址:https://www.cnblogs.com/lanzi/p/1935358.html