• 已知的Oracle BUG
• 共享池碎片
-- o V$SQLAREA 视图
-- o X$KSMLRU 视图
• 小的共享池尺寸
-- o 库高速缓冲(library cache)命中率
-- o 共享池大小的计算
4.对ORA-04031 的高级分析
诊断并解决ORA-04031 错误
对于大多数应用来说,共享池的大小对于Oracle 性能来说都是很重要的。共享池中保存数据字典高速缓冲
和完全解析或编译的的PL/SQL 块和SQL 语句。
当我们在共享池中试图分配大片的连续内存失败的时候,Oracle 首先刷新池中当前没使用的所有对象,使空
闲内存块合并。如果仍然没有足够大单个的大块内存满足请求,就会产生ORA-04031 错误。
当这个错误出现的时候你得到的错误信息如下:
Error: ORA 4031
Text: unable to allocate %s bytes of shared memory (%s,%s,%s)
----------------------------------------------------------------------------------------------------------------
Cause: More shared memory is needed than was allocated in the shared pool.
Action: 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 init.ora parameter "shared_pool_size".
1.共享池相关的实例参数
在继续之前,理解下面的实例参数是很重要的:
• SHARED_POOL_SIZE – 这个参数指定了共享池的大小,单位是字节。可以接受数字值或者数
字后面跟上后缀"K" 或 "M" 。"K"代表千字节, "M"代表兆字节。
• SHARED_POOL_RESERVED_SIZE – 指定了为共享池内存保留的用于大的连续请求的共享池
空间。当共享池碎片强制使Oracle 查找并释放大块未使用的池来满足当前的请求的时候,这个参
数和SHARED_POOL_RESERVED_MIN_ALLOC 参数一起可以用来避免性能下降。
这个参数理想的值应该大到足以满足任何对保留列表中内存的请求扫描而无需从共享池中刷新对
象。既然操作系统内存可以限制共享池的大小,一般来说,你应该设定这个参数为
SHARED_POOL_SIZE 参数的 10% 大小。
• SHARED_POOL_RESERVED_MIN_ALLOC –这个参数的值控制保留内存的分配。如果一个足
够尺寸的大块内存在共享池空闲列表中没能找到,内存就从保留列表中分配一块比这个值大的空
间。默认的值对于大多数系统来说都足够了。如果你加大这个值,那么Oracle 服务器将允许从这
个保留列表中更少的分配并且将从共享池列表中请求更多的内存。这个参数在Oracle 8i 是隐藏
的。
2.诊断ORA-04031 错误
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。
3.解决ORA-04031 错误
• ORACLE BUG
要解决这个错误(如果可以称得上错误的话),进行的诊断的第一步是在你的平台上使用最新的补丁集。
大多数的ORA-04031错误都和BUG 相关,可以通过使用这些补丁来避免。
下面表中总结和和这个错误相关的最常见的BUG,可能的环境和修补这个问题的补丁。
代码:
BUG-----------------描述--------------------------------Workaround-----------------Fixed
<Bug:1397603> ORA-4031 / SGA memory leak of _db_handles_cached = 0 8.1.7.2
PERMANENT memory occurs for 901
buffer handles.
<Bug:1640583> ORA-4031 due to leak / cache buffer Not available 8171/901
chain contention from AND-EQUAL
access
<Bug:1318267> INSERT AS SELECT statements may _SQLEXEC_PROGRESSION_COST=0 8171,8200
not be shared when they should be
if TIMED_STATISTICS. It can lead
to ORA-4031
<Bug:1193003> Cursors may not be shared in 8.1 Not available 8162,8170,901
when they should be.
--------------------------------------------------------------------------------------
格式化了好几次,也不是很好看
有需要的朋友到去下载吧
如果想彻底的避免04031的问题,编码的时候就该注意了。
不过类似的问题还是会出现,这似乎是个永恒的话题
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-84322/,如需转载,请注明出处,否则将追究法律责任。