4031的错误大部分是未绑定变量SQL语句引起的。排除DBbug后,就要从v$sqlarea与v$open_cursor中找出元凶sql语句。
元凶有两种:
1,未绑定变量并且大量执行的sql,这种sql就是晶晶模拟出来的现象,参见
晶晶实验二十一:一个简单4031例子的引申。这种SQL可以通过如下查询抓出来。
先找出sql:
| select count(*), sum(sharable_mem),substr(sql_text,50) from v$sqlarea group by substr(sql_text,50) order by 1,2; |
substr取的字符的个数,根据应用进行调整。
然后根据找出的SQL确定是哪个应用执行的
| 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
| 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.
| 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; |