ORA-00494

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/23754390/viewspace-692240/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23754390/viewspace-692240/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值