热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

关于ORA-01000:maximumopencursorsexceeded"问题分析总结

关于ORA-01000:maximumopencursorsexceeded问题分析总结

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

关于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 2:
查看游标使用情况:
select o.sid, oSUSEr, machine, count(*) num_curs
from v$open_cursor o, v$session s
where user_name = 'user' and o.sid=s.sid
group by o.sid, osuser, machine
order by num_curs desc;

此处的user_name='user'中,user代表占用数据库资源的数据库用户名.

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的数量都无济于事。碰到这种情况极可能就是表结构的问题了。

那么如何来验证呢?
案例来自itpub,yangtingkun:
“我们系统的数据量比较大,近200张表,有些表一天要插入1000000条左右的数据。表是使用ER/STDIO设计的,然后直接生成建表的脚本,,由于没有设置physical_attributes_clause语句中的建表参数,因此使用了默认的参数。好像是INITIAL 10K NEXT 10K PCTFREE 20 PCTUSED 50由于表的存储空间太小,在
很短的时间内就会装满,因此Oracle就需要不停为30多张表(数据量较大的)申请空间。于是在程序运行了一段时间后,开始出现ORA-01000: maximum open
cursors exceeded的错误。 我将游标大小改到了300,还是出现错误,改到1000以后开始出现了ORA-01001:invalid cursors。再怎么加大open_cursors的数量都
无济于事。 使用select * from v$open_cursors查询,发现有几百条的INSERT语句游标没有释放。

开始怀疑是程序调用的问题,仔细检查程序没有发现问题。但是发现对某张表进行TRUNCATE操作后,对此表进行插入的游标全部释放,于是开始怀疑是表结构本
身的问题。重新设置了建表参数,将数据量最大的表的INITIAL和NEXT均设置为50M。至今未再出现同样的错误。”

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去进行上述的操作,估计会造成大量的游标来不及释放。以上只是我的估计。”

linux

推荐阅读
  • MySQL Server 8.0.28 升级至 8.0.30 的详细步骤
    为了修复安全漏洞,本文档提供了从 MySQL Server 8.0.28 升级到 8.0.30 的详细步骤,包括备份数据库、停止和删除旧服务、安装新版本以及配置相关环境变量。 ... [详细]
  • RocketMQ在秒杀时的应用
    目录一、RocketMQ是什么二、broker和nameserver2.1Broker2.2NameServer三、MQ在秒杀场景下的应用3.1利用MQ进行异步操作3. ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • 本文介绍了如何在 Spring 3.0.5 中使用 JdbcTemplate 插入数据并获取 MySQL 表中的自增主键。 ... [详细]
  • BIEE中的最终用户界面被称为Presentation Layer(展现层)。展现层呈现的内容与用户在Web报表开发界面中看到的一致,使用业务语言进行描述,隐藏了技术细节,如星型模型。本文将详细介绍展现层的设计要点及其与业务模型层的关系。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • PHP 使用 Cookie 进行访问授权的方法
    本文介绍了如何使用 PHP 和 Cookie 实现访问授权,包括表单验证、数据库查询和会话管理等关键步骤。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 操作系统如何通过进程控制块管理进程
    本文详细介绍了操作系统如何通过进程控制块(PCB)来管理和控制进程。PCB是操作系统感知进程存在的重要数据结构,包含了进程的标识符、状态、资源清单等关键信息。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 深入解析HTML5字符集属性:charset与defaultCharset
    本文将详细介绍HTML5中新增的字符集属性charset和defaultCharset,帮助开发者更好地理解和应用这些属性,以确保网页在不同环境下的正确显示。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 本文介绍了在 MySQL 中如何使用正则表达式来提高查询效率,通过具体示例展示了如何筛选包含中文字符的记录,并详细解释了正则表达式的各种特殊字符和结构。 ... [详细]
author-avatar
温温
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有