您的位置:首页 > 数据库 > Oracle

Oracle-解决ORA-4031错误

2020-07-14 06:27 363 查看

ORA-4031错误的原因:

通常是大量的hard parse导致了shared pool中的free list中产生大量的内存小碎片,当一个须要非常大内存来进行hard parse的sql语句到来时。无法从free list中找到内存,即使进行内存的释放。还是不能找到符合的内存块,从而报ORA-4031错误。

解决方法:

1.清空share pool
alter system flush shared_pool
将shared pool中的全部内存清空,治标不治本。
一段时间过后,可能会同时出现大量的硬解析,慎用。

2.SQL共享
sql需要注意统一书写风格 ,空格,大小写,数值不一样,回车等等,都会影响SQL硬解析不一致。
如果仅仅数值不一样就使用绑定变量改写SQL。

找到没有共享的SQL:
Select sql_fulltext from v$sql where executions=1 order by sql_text
如果某些sql 没有共享,在某一个区域会发现一部分SQL语句的静态部分相同,动态部分不同。
如果发现部分非共享SQL仅仅是谓词条件的值不同,
可以使用alter system set cursor_sharing = ‘force’;
来强制使用绑定变量。

3.扩大share pool保留区
保留区:分配内存时,Oracle会先从普通共享池的Free Lists中寻找空间,Free Lists无可用空间时,就会寻找可释放内存,如果无法找到可释放内存,就会从保留池中分配内存。

查看在保留区中请求空间失败的次数,只要有一次,肯定会发生4031错误。
select request_misses from v$shared_pool_reserved;

查看保留区大小:
Show parameter shared_pool_reserved_size
修改保留区大小:
alter system set shared_pool_reserved=xxM scope=both;

4.扩大share pool大小
从Oracle10g开始 统一设置SGA TARGET,Oracle自动动态分配各个池的大小。
SGA TARGET 总值
SGA_max_size 限制所修改的最大的内存大小(静态参数,需要重启生效)。
手动修改的share pool的大小必须大于当前Oracle自动分配的share pool大小才会生效。

查看Oracle自动分配SGA中各个池的情况。
Select component,current_size from v$sga_dynamic_components

使用v $shared_pool_advice查看Oracle根据系统当前情况的share pool建议值。
select SHARED_POOL_SIZE_FOR_ESTIMATE,SHARED_POOL_SIZE_FACTOR
from v $shared_pool_advice;

SHARED_POOL_SIZE_FACTOR=1时,为share pool最佳值。
alter system set shared_pool_size = xxxM scope=both

Sharepool设置大的缺点:
数据库运行一段时间后,经过大量硬解析,Library cache空间也会很大,会导致library cache中的链非常长,每次遍历需要消耗更多的时间,持有更长时间的library cache latch锁,会导致其他会话出现锁的争用,而执行sql时的等待。
10g以后出现子share pool,保证了每个share pool中的链不会太长,减少了latch的争用。

5.将使用内存非常大的对象keep在内存中
DBMS_shared_pool.keep(‘对象名’),
查找出需要keep的对象:
select owner,name,namespace,type,sharable_mem from v$db_object_cache where sharable_mem>10000
and (type=‘PACKAGE’ or type=‘PACKAGE BODY’ or type=‘FUNCTION’ or type=‘PROCEDURE’) and kept=‘NO’;

当Oracle发现有大量小的Free Chunk时,找不到合适的Free Chunk,会去libaryary cache中,找个大的chunk,将其空间释放(根据Share Pool中的LRU链表规则),重新链到Free List用于存放新的硬解析执行计划,如果此时再来一个大的SQL,无法找到合适的Free Chunk也在library cache无法找到可释放空间,也会出现4031错误。

Oracle根据数据库平时的运行负载,计算出内存应该设置的比较合适的值
各个内存池优化性能视图:
V$ SGA_TARGET_ADVICE
V$ SHARED_POOL_ADVICE
V$ STREAMS_POOL_ADVICE
V$ JAVA_POOL_ADVICE
V$ DB_CACHE_ADVICE
v$ PGA_TARGET_ADVICE

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: