ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 10gR2.0.4数据库压力较大,IO发生短暂停止响应的时候,可能导致数据库实例崩溃

10gR2.0.4数据库压力较大,IO发生短暂停止响应的时候,可能导致数据库实例崩溃

原创 Linux操作系统 作者:yanyp 时间:2009-07-06 17:27:59 0 删除 编辑

From:Ningoo

Oracle10.2.0.4中,如果数据库压力较大,IO发生短暂停止响应的时候,可能导致数据库实例崩溃。在alert中可以找到如下错误:

Thu Apr  2 10:55:36 2009
Errors in file /bdump/test.trc:
ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 82866'
Thu Apr  2 10:55:39 2009
Killing enqueue blocker (pid=82866) on resource CF-00000000-00000000
 by terminating the process

ORA-00494或许还会伴随ORA-600 [2103]错误的出现,这是Oracle10.2.0.4中引入的一个行为改变。在Oracle10.2.0.4中,如果一个进程在指定的时间(默认900秒)内无法获得CF锁,则CF锁的执行进程会被kill。从Metalink上可以发现,CF enqueue相关的bug是相当的多,10.2.0.4这个行为的引入,估计是Oracle视图对这个问题做出解决的一种尝试。但是这种直接kill进程的激烈方式,肯定不是最好的方式,如果锁的持有者是后台进程,直接kill则很可能直接导致实例崩溃。

Metalink上对此的描述如下:

In 10.2.0.4 database alert log the following error appears:

ORA-00494: enqueue [CF] held for too long (more than 900 seconds)

This error can also be accompanied by ORA-600 [2103] which is basically the same problem -
a process was unable to obtain the CF enqueue within the specified timeout (default 900 seconds).

This behavior. can be correlated with server high load and high concurrency on resources,
IO waits and contention, which keep the Oracle background processes from receiving the necessary
resources.

要避免该问题,最好当然是找出为什么会有进程持有CF这么长的时间。另外,也可以通过隐含参数禁止Oracle主动kill CF锁的持有进程。这个参数会禁止Oracle去kill所有持有CF锁的进程,不管是后台进程还是前台进程:

_kill_controlfile_enqueue_blocker=false

也可以通过设置另外一个隐含参数禁止Oracle去kill持有锁的后台进程:

_kill_enqueue_blocker=1(默认为3)

进程请求CF enqueue的time out时间默认是900秒,这是由下面的参数控制的:

_controlfile_enqueue_timeout=900

进程持有CF enqueue的时间最长不能超过120秒:

_controlfile_enqueue_holding_time=120

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/230160/viewspace-608452/,如需转载,请注明出处,否则将追究法律责任。

下一篇: JVM优化配置
请登录后发表评论 登录
全部评论

注册时间:2009-04-12

  • 博文量
    139
  • 访问量
    171437