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 来加大共享池保留空间的可用内存。 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 错误就是因为共享池保留空间缺少连续空间所致。
如果:REQUEST_FAILURES > 0 并且LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC
或者REQUEST_FAILURES 等于0 并且LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC
那么是因为在库高速缓冲缺少连续空间导致ORA-04031 错误
那么是因为在库高速缓冲缺少连续空间导致ORA-04031 错误
第一步应该考虑降低SHARED_POOL_RESERVED_MIN_ALLOC 以放入更多的对象到共享池保留空间中并且加大SHARED_POOL_SIZE。