oracle登陆账号DBA与项目的那堆事(3)开发之 游标顾头不顾尾

不知有人碰到过这种情况没,程序运行一段时间后,报ORA-01000: 超出打开游标的最大数。这种情况很大可能是开发在写程序时,对游标误用或没有注意引起。如有可能在一个循环中,在打开游标后,并没有即时或没有关闭游标,很容易就出现这种问题了,这时一定要让开发记得,有始要有终 ,游标要记得即时关闭。
另一种比较小的可能性是资源释放没有问题,确实是数据库的最大游标数太小了.
具体分析下.1. 查看游标相关参数

   --查看库中每个session可打开的最大游标数    show parameter open_cursors;    --PL/SQL 游标高速缓存    --高速缓存可以避免用户再次执行语句时重新进行语法分析。这个值设置得足够高, 可以防止应用程序耗尽打开的游标。    show parameter session_cached_cursors;

2.统计库当前库游标使用情况

--oracle账号 输入指定用户名查询,要查全部可输入'%' select o.sid, s.osuser, s.machine, count(*) num_curs  from v$open_cursor o, v$session s where o.sid=s.sid   and o.user_name like '&1' group by o.sid, osuser, machine order by num_curs desc;

3. 对怀疑的sid查看其具体的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 = 158;

上面是分步说明,为了省事,下面把它们合成一条语句了.

with cso as ( select o.sid, s.osuser, s.machine, count(*) num_curs   from v$open_cursor o, v$session s  where o.sid=s.sid    and o.user_name like '&1'  group by o.sid, osuser, machine  ) select o.sid,q.sql_text   from v$open_cursor o, v$sql q  where q.hash_value=o.hash_value and o.sid = (        select sid from cso where num_curs =            (select max(num_curs) from cso)         ) ;

解决方法:如确实是数据库的session最大游标数太小了

 --1.加大open_cursors参数 alter system set open_cursors=1000 scope=both;    --2.加大标高速缓存数 alter session set session_cached_cursors=100;   -- 附上一条sql,可查指定sid的当前游标参数使用情况  select sid,n.name,s.value used  from     sys.v_$statname n,     sys.v_$sesstat s   where s.statistic# = n.statistic#      and n.name in ('opened cursors current', 'session cursor cache count')    and sid= sid号

如由程序引起. 由具体sql排查相关程序,找到责任人,小小K他一顿. 嘿嘿.
MAIL:xcl_168@aliyun.com
Blog:https://blog.csdn.net/xcl168

此条目发表在oracle metalink账号分类目录,贴了标签。将固定链接加入收藏夹。