March 2008 Archives

查找 ora-4031 元凶的办法

转载自:http://space.itpub.net/?uid-13095417-action-viewspace-itemid-217984

From rollingpig

找元凶的更好方法是看 v$open_cursor+V$sqlarea group by SID

CODE:

select /*+ordered use_hash(c s) no_merge(s) no_merge(c) */
sid,sum(sharable_mem)/1024/1024 from
v$open_cursor c , v$sqlarea s
where c.hash_value =s.hash_value
group by c.sid
order by 2 desc
...
...

立刻就可以找出占用大量share pool memory的SID
然后需要的话再select * from v$open_cursor where sid = .. 看到具体语句

From feng_xin

4031的错误大部分是未绑定变量SQL语句引起的。排除bug后,就要从v$sqlarea与v$open_cursor中找出元凶sql语句。

元凶有两种:
1, 未绑定变量并且大量执行的sql, 这种sql就是晶晶模拟出来的现象。可以通过如下SQL语句抓出来。

先找出sql:

CODE:

select count(*), sum(sharable_mem),substr(sql_text,50) from v$sqlarea group by substr(sql_text,50) order by 1,2;

substr取的字符的个数,根据应用进行调整。

然后根据找出的SQL确定是哪个应用执行的

CODE:

select sid,sharable_mem,s.sql_text from v$open_cursor c , v$sqlarea s where c.hash_value =s.hash_value and s.sql_text like 'xxxxxxxx%'


2, 单条SQL需要大量内存空间,如果内存里有空间但是是由很多小空间碎片组成的话,当执行这个占用内存大的单条sql时,由于不能分配空间,而产生4031错误。这种sql一般来说都是够长够复杂的sql. 可以通过如下SQL语句抓出来。

先找出sql

CODE:

select sid,s.sharable_mem,s.sql_text,s.ADDRESS,s.HASH_VALUE from v$open_cursor c , v$sqlarea s where c.hash_value =s.hash_value order by sharable_mem;


通常sql_text不能把sql显示完整,用如下查询找出完整的sql.

CODE:

select a.address,a.hash_value,a.piece,a.sql_text,a.command_type from v$sqltext a,
(select sid,s.sharable_mem,s.sql_text,s.ADDRESS,s.HASH_VALUE from v$open_cursor c , v$sqlarea s where c.hash_value =s.hash_value and s.sharable_mem>xxxxx) b
where a.address=b.address and a.hash_value=b.hash_value
order by 1,2,3;

About this Archive

This page is an archive of entries from March 2008 listed from newest to oldest.

December 2007 is the previous archive.

April 2008 is the next archive.

Find recent content on the main index or look in the archives to find all content.