oracle-故障-ORA-­01000 maximum open cursors exceeded处理

简介:
java.sql.SQLException: ORA­-00604: error occurred at recursive SQL level 1
ORA­-01000: maximum open cursors exceeded
ORA­-00604: error occurred at
recursive SQL level 1

1.查看数据库当前的游标数配置

    show parameter open_cursors;

2. 通过sql查询session打开cursor的情况

SELECT s.inst_id,s.username,
       o.sid,
       osuser,
       machine,
       COUNT(*) num_curs
  FROM gv$open_cursor o,
       gv$session     s
 WHERE o.sid = s.sid
   AND o.inst_id = s.inst_id
 GROUP BY s.inst_id,s.username,
          o.sid,
          osuser,
          machine
 ORDER BY num_curs DESC;

3. 通过以下sql查询该会话的具体游标情况

SELECT oc.sql_text,
       oc.sql_id,
       COUNT(1) cnt
  FROM gv$open_cursor oc
 WHERE oc.sid = 578
   AND oc.inst_id = 2
 GROUP BY oc.sql_text,
          oc.sql_id
 ORDER BY cnt DESC;

select sid ,sql_text, user_name, count(*) as "OPEN CURSORS" from v$open_cursor where sid in ($SID) group by sid ,sql_text, user_name;

4.通过ash查询该会话的具体信息

SELECT *
  FROM gv$active_session_history ash
 WHERE ash.session_id = 578
   AND ash.session_serial# = 34481
   and ash.SQL_ID in ('231zgb2w57xgd')
 ORDER BY ash.sample_time;

5. 查看该会话当前的状态

SELECT *
  FROM gv$session s
 WHERE s.sid = 578;

Every application using oracle database as backend repository runs several SQL statements.
For every SQL statement execution in oracle database, certain area in memory is allocated. Oracle PL/SQL allows you to name this area. This private SQL area is called
context area or cursor. These cursors take up space in the shared pool (essential memory component of oracle database), specifically in the library cache. To keep a
renegade session from filling up the library cache, or clogging the CPU with millions of parse requests, we set the parameter OPEN_CURSORS.
One defines the value/limit of these cursors as a DB parameter called OPEN_CUSRSORS in database instance.
OPEN_CURSORS DB parameter sets the maximum number of cursors each session can have open, per session. For example, if OPEN_CURSORS value is set to 1000,
then each session can have up to 1000 cursors open at one time.

使用Oracle数据库的时候,经常会碰到有ORA-01000: maximum open cursors exceeded的错误。实际上,这个错误的原因,主要还是代码问题引起的。 ora-01000: maximum open cursors exceeded:表示已经达到一个进程打开的最大游标数。
这样的错误很容易出现在Java代码中的主要原因是:Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。
尤其是,如果你的createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。
一般来说,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,而且使用了这些Statment后,及时关闭。
最好是在执行了一次executeQuery、executeUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statment关闭。
对于出现ORA-01000错误这种情况,单纯的加大open_cursors并不是好办法,那只是治标不治本。实际上,代码中的隐患并没有解除。而且,绝大部分情况下,open_cursors只需要设置一个比较小的值,就足够使用了,除非有非常特别的要求。

6. 解决方案

    一、从源头上解决方案(建议)
         将上述分析后的功能异常反馈给开发人员检查代码,把涉及到打开链接的地方,用完之后,千万别忘记关掉。

    二、临时解决方案(不已建议)
         通过修改oracle系统参数:将OPEN_CURSORS 的值设置得足够大,以避免应用程序用尽所有打开的游标。应用程序不同,该值也不同。即便会话打开的游标数未达 OPEN_CURSORS 指定的数量(即设置的值高于实际需要的值), 也不会增加系统开销
         
         
参考:
ORA­01000 : Troubleshooting Open Cursors Issues (Doc ID 1477783.1)
目录
相关文章
|
14天前
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
54 11
|
2月前
|
存储 Oracle 关系型数据库
数据库数据恢复—Oracle ASM磁盘组故障数据恢复案例
Oracle数据库数据恢复环境&故障: Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 ,ASM实例不能mount。 Oracle数据库故障分析&恢复方案: 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储元数据损坏,导致磁盘组无法挂载。
|
5月前
|
Oracle 关系型数据库 数据库
关系型数据库Oracle 故障转移能力
【7月更文挑战第10天】
65 2
|
7月前
|
运维 Oracle 关系型数据库
服务器数据恢复-raid5故障导致上层oracle数据库故障的数据恢复案例
服务器数据恢复环境: 一台服务器中有一组由24块FC硬盘组建的raid5磁盘阵列,linux操作系统+ext3文件系统,服务器上层部署有oracle数据库。 服务器故障&检测: raid5阵列中有两块硬盘出现故障掉线,导致服务器上层卷无法挂载,oracle数据库无法正常使用。 通过管理后台查看服务器中硬盘的状态,显示有两块硬盘处于离线状态。
|
存储 Oracle 算法
数据库数据恢复-ORACLE数据库常见故障的数据恢复可能性分析
ORACLE数据库常见故障: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE数据库ASM存储破坏。 3、ORACLE数据库数据文件丢失。 4、ORACLE数据库数据文件部分损坏。 5、ORACLE数据库DUMP文件损坏。
|
Oracle 关系型数据库 网络安全
连接Oracle数据库失败(ORA-12514)故障排除
ORA-12514的故障是很多新手在连接Oracle数据库时经常遇到故障,它通常表示无法连接到数据库实例,这里姚远老师告诉大家如何排除这类故障。
10051 0
|
存储 SQL 负载均衡
Oracle实现高可用性的工具(负载均衡/故障切换)
Oracle实现高可用性的工具(负载均衡/故障切换)
257 0

热门文章

最新文章

推荐镜像

更多