http://space.itpub.net/?uid-92530-action-viewspace-itemid-128009

  

今天看PUB上對錯誤的分析貼回來自己研究下

本人資質比較愚頓

一般来说是游标不够用了。
只需在initSID.ora文件中加上一行
open_cursors = ****
但是,很可能是由于你的程序或数据库的结构存在着一些潜伏的问题,如jlandzpa所说,没有关闭游标等。

我的程序有一阵一直在报这个错误,把OPEN_CURSOR加大到了300甚至1000还在出错,后来发现是表的STORAGE设置有问题。

建议你查一下自己的程序。

Good Luck!

昨天说的有些错误,应该是physical_attributes_clause语句。

我们系统的数据量比较大,近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。

至今未再出现同样的错误。

--------------------

再次提问ORA-01000: maximum open cursors exceeded问题

这个问题yangtingkun讲的非常详细,使我茅塞顿开,但我还有一些问题向诸位高人请教。
我这里出的问题也是ORA-01000: maximum open cursors exceeded ,我将游标数由300提高到500仍然不能解决这个问题。看了这篇帖子我非常高兴,但有一些问题不明白。
我使用了select * from v$open_cursor进行查询后看不出来哪些游标未被释放。一共有近4000条记录,hash_value字段象特殊点,值从几万到几百万都有,请问怎样判定哪些游标未被释放,有多少。
另外请教一下,怎样重新设置了建表参数,能指点一下所需命令吗。数据库里表数量极大,怎样找到数据量最大的表啊。
我是菜鸟,请不要见笑。不吝赐教。

---------------

首先通过v$open_cursor中的SQL_TEXT字段可以查出没有释放的SQL是大致是什么语句。

由于建表参数设置不当,会有很多的INSERT语句无法释放。

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

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

-------------------------

是不是存储参数不合理的时候,INSERT在等待分配空间,而所有的SQL都使用CURSOR实现,这样在大量DML时候,自然会出现很多OPEN_CURSOR。

----------------

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

以上只是我的估计。

-----------------------

我按照yangtingkun的提示使用 SELECT * FROM V$OPEN_CURSOR WHERE SQL_TEXT LIKE 'INSERT%‘ 后,有71条,用到十几个表,大多数有10条左右纪录,不知道是不是这十几个表未释放游标。但是再执行了一下上面的语句,变成了151条,用到的表也大多变了。怎样才能找出哪些表的storage设置不合理呢。另外,数据库正在使用时修改storage参数会否有问题。

--------------------------------

每次不一样是正常的,你看到的是你查询时刻正在使用或没有释放的游标。

你可以先锁定一张表,比如发现关于a表的插入记录比较多,可以SELECT * FROM V$OPEN_CURSOR WHERE SQL_TEXT LIKE 'INSERT INTO A %';

一般来说,同一时间同一用户对一张表的插入操作只有一次。如果发现许多,说明这张表可能有问题。

根据我的经验吐舌

-------------------------

对yangtingkun诸位大侠的帮助万分感谢。
对于开始时表参数 
PCT FREE 10 
PCT USED 40 
STORAGE(INITIAL 10K 
NEXT 10K 
MINEXTENTS 1 
MAXEXTENTS 121 
PCTINCREASE 0 )
这几行我实在不太明白。一般的书上都见不到。PCT FREE 10 ,PCT USED 40是什么意思。 
INITIAL 10K 
NEXT 10K 
MINEXTENTS 1 
MAXEXTENTS 121 
PCTINCREASE 0 
这几行好像只能看出表的最初大小,每次增加的段的大小,可以增加多少个段。好像看不出用了多少个段,表又多大。表的属性里有一项blocks是不是有关。

-------------------

quote:
最初由 hahadelphi 发布
PCT FREE 10 ,PCT USED 40是指一个block块的存放数据规则
<10%的时候可以写数据,>40% block就不用了(用下一个block了)



你好像说反了吐舌

PCT FREE 10 指当一个block还剩10%的时候就不再进行INSERT了,而使用新的block,剩余部分为update预留。

PCT USED 40 指一个block删除数据,数据小于此block空间的40%时,该block重新对INSERT可用,在此之前,此block不用于INSERT。

表有多大从这里是看不出来的。

-----------------

不好意思,前面写错了,initial 参数不能使用ALTER TABLE来修改。

----------------------

现在发现用前边的方法找到的标基本上是固定的十几个左右,能否请yangtingkun大侠或知道的朋友指点一下应使用的语句以及应在什么状态下使用,是否应停下应用,或者没有某些应用任务在运行时才可使用。
os:AIX 4.3.3
application: oracle 11.5.2
database:8.1.6

--------------

什么时候都可以用,没有问题的。

quote:
最初由 xzforacle 发布
我认为可以通过修改参数 PCTINCREASE 来解决。 ORACLE在默认情况下是设 PCTINCREASE 50
这样虽然可能导致空间浪费。但是不会导致上述问题。设PCTINCREASE 0 的话 如果数据库经过良好的设计可以减少碎片。但是很多情况下数据库设计时并没有或无法考虑数据的增长。
设PCTINCREASE 0 还会导致数据库无法自动合并相邻的自由空间



可能我前面写错了,最开始的时候pctincrease的值就是50。
我现在表的初始化空间是50M,而原来是10k,你可以算一算要分配多少次才可以到达这个数值。所以如果仅仅靠设置PCTINCREASE是没有用的。
--------------------

sigh

其实这些表参数很容易理解的
最理想的状况是initial参数就能装下所有表数据
不过不可能
pctincrease设置为0比较好

不为0你仔细分析后会发现对数据库的负作用很大

可能碎片更多
再说也没有那么多空间让smon来合并
合并了也未必能满足pctincrease导致的不一样的extents的大小..........

本来比较简单的问题,描述起来就多了
大家多看看多思考很快就能掌握啦,呵呵

建议:

合适的initial.所有表一致的next extents
pctincrease=0

至于具体所少next和initial
根据具体应用衡量


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值