某日上午,公司业务组过来说前台页面提示出游标无法打开的错误。于是产看oracle alert日志,看到很多ORA-01000的错误信息。于是赶紧连上数据库执行了一下查询操作:
select a.value, s.username, s.sid, s.serial#
from v$sesstat a, v$statname b, v$session s
where a.statistic# = b.statistic#
and s.sid=a.sid
and b.name = 'opened cursors current'
and s.username is not null
order by 1 desc ;
查询结果表明有5个会话的cursor已经达到了500,于是查看系统cursor相关参数的设置
SQL> show parameter cursor
NAME TYPE VALUE
------------------------------------ ----------- --------
cursor_sharing string EXACT
cursor_space_for_time boolean FALSE
open_cursors integer 500
session_cached_cursors integer 50
最初简单的认为open_cursors参数设置太小于是将该参数进行了修改:
SQL> alter system set open_cursors=1000 scope=both;
System altered.
SQL> show parameter cursor
NAME TYPE VALUE
------------------------------------ ----------- ------
cursor_sharing string EXACT
cursor_space_for_time boolean FALSE
open_cursors integer 1000
session_cached_cursors integer 50
但是很快1个多小时之后同样的问题又出现了,在alert日志中很快又出现了ora-01000错误。由于业务系统破一直很稳定,很显然是由于cursors
没有正常关闭导致。于是询问业务人员得知昨天夜里进行过程序发布,但是这次发布在多台db server上都做了。其他db server 均没有出现这个情况。
首先这个问题应该很明确是由于cursor没有正常关闭造成,应该找出导致游标没有正常关闭的sql语句。于是对数据库在发生ora-01000到现在的时间
生成了一份AWR。直接查看topsql ordered byt parse calls部分

查看这条sql的文本看到如下信息:
DECLARE
IP varchar2(15);
qry varchar2(4000);
v_theCursor INTEGER DEFAULT dbms_sql.open_cursor;
v_columnValue VARCHAR2(4000);
v_status INTEGER;
v_descTbl dbms_sql.desc_tab;
其余部分省略。。。。
到目前来看问题已经很明确由于开发的一个trigger的代码中显示调用了open_cursor却没有关闭造成ora-01000的原因。然后禁用该trigger问题ora-01000没有继续出现。
仅此记录。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26723566/viewspace-1805857/
,如需转载,请注明出处,否则将追究法律责任。