某次客户报 ORA-04031 shared pool共享池爆满,此类错误一般是硬解析导致,但是此次用户中发现了不完全是硬解析导致。
共享池(Shared pool)是SGA中最关键的内存片段,共享池主要由库缓存(共享SQL区和PL/SQL区)和数据字典缓存组成。其中库缓存的作用是存放频繁使用的sql,pl/sql代码以及执行计划。数据字段缓存用于缓存数据字典。在内存空间有限的容量下,数据库系统根据一定的算法决定何时释放共享池中的sql,pl/sql代码以及数据字典信息。
经过长时间的跟踪发现数据库中存在infomix数据库执行语句不断的执行大约1秒钟表几次,导致数据库产生大量的硬解析消耗shared pool资源,infomix语句如下:
SET ISOLATION TO DIRTY READ
PARSE ERROR: ospid=12859, error=922 for statement:
SET ISOLATION TO DIRTY READ
PARSE ERROR: ospid=12951, error=922 for statement:
SET ISOLATION TO DIRTY READ
另外经过实验测试,将该语句每秒钟执行3次在Oracle 11.0.2.4版本上执行,会致使数据库产生大量的硬解析消耗shared pool资源,直到shared pool共享池爆满。Oracle 11.2.0.1 版本却不存在这个问题,估计应该是BUG。
检查方法:
启用事件记录,记录错误SQL语句
ALTER SYSTEM SET EVENTS ‘10035 trace name context forever, level 1’;
关闭事件记录,记录错误SQL语句
ALTER SYSTEM SET EVENTS ‘10035 trace name context off’;
评论已关闭。