关于ORA-01000: maximum open cursors exceeded" 问题分析总结

2014-11-24 17:55:28 · 作者: · 浏览: 0

关于ora-01000:超出最大可打开的游标数 的一点理解
ORA-01000: maximum open cursors exceeded"怎么解决
ERROR at line 1:
ORA-01000: maximum open cursors exceeded


问题分析:
1.游标open后,出错了又没有close.
2.可能是表结构的问题。

解决方法:
step 1:
查看数据库当前的游标数配置
show parameter open_cursors;


step 3:
查看游标执行的sql情况:
select o.sid q.sql_text
from v$open_cursor o, v$sql q
where q.hash_value=o.hash_value and o.sid = 123;

step 4:
根据游标占用情况分析访问数据库的程序在资源释放上是否正常,如果程序释放资源没有问题,则加大游标数。
alter system set open_cursors=2000 scope=both;

以上为cursors数确实不够的情况下的处理方法。
但在有的时候,就算是加大了open_cursor 。譬如,我将游标大小改到了300,还是出现错误,改到1000以后开始出现了ORA-01001:invalid cursors。再怎么加大
open_cursors的数量都无济于事。碰到这种情况极可能就是表结构的问题了。



FYI:
首先通过v$open_cursor中的SQL_TEXT字段可以查出没有释放的SQL是大致是什么语句。
由于建表参数设置不当,会有很多的INSERT语句无法释放。



SELECT * FROM V$OPEN_CURSOR WHERE SQL_TEXT LIKE 'INSERT%‘

找一找哪些表的INSERT语句没有释放的游标比较多。从ALL_TABLES里查看该表的建表参数是否合适。


yangtingkun的分析:
“开始时表参数
PCT FREE 10
PCT USED 40
STORAGE(INITIAL 10K
NEXT 10K
MINEXTENTS 1
MAXEXTENTS 121
PCTINCREASE 0
)
9K的空间,以我们的系统几秒钟就塞满了,下一条插入语句来的时候ORACLE要去自动申请空间,该语句所占用的游标暂时无法释放。ORACLE申请的空间马上又被
塞满,又要去申请新的空间。如果二、三十多张表在几个钟头内都不停要求ORACLE去进行上述的操作,估计会造成大量的游标来不及释放。以上只是我的估计。”