- 最后登录
- 2023-8-16
- 在线时间
- 1686 小时
- 威望
- 2135
- 金钱
- 50532
- 注册时间
- 2011-10-12
- 阅读权限
- 200
- 帖子
- 5207
- 精华
- 39
- 积分
- 2135
- UID
- 2
|
3#
发表于 2012-3-19 20:48:10
请把 完整的TRACE文件上传。
ODM FINDING:
CF: Controlfile Transaction Control file schema global enqueue
ORA-00494: enqueue [CF] held for too long (more than 900 seconds)
This error can also be accompanied by ORA-600 [2103] error which is basically the same problem - a process was unable to obtain the CF enqueue within the specified timeout (default 900 seconds) or after 15minutes.
In other words the control file of the instance was not able to be accessed by the Oracle background process within 15 minutes, hence the ORA-00494 error and instance crash.. This is by design..
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.
Cause
=======
The problem has been investigated first in Bug 7692631 - 'DATABASE CRASHES WITH ORA-494 AFTER UPGRADE TO 10.2.0.4' and then in unpublished Bug 7914003 'KILL BLOCKER AFTER ORA-494 LEADS TO FATAL BG PROCESS BEING KILLED'
Solution
========
This kill blocker interface / ora-494 was introduced in 10.2.0.4. This new mechanism will kill *any* kind of blocking process, non-background or background.
* The difference will be that if the enqueue holder is a non-background process, even if it is killed, the instance can function without it.
* In case the holder is a background process, for example the LGWR, the kill of the holder leads to instance crash.
If you want to avoid the kill of the blocker (background or non-background process) you can set _kill_controlfile_enqueue_blocker=false.
This means that no type of blocker will be killed anymore although the resolution to this problem should focus on why the process is holding the enqueue for so long. Also, you may prefer to only avoid killing background processes, since they are vital to the instance, and you may want to allow the killing of non-background blokers.
This has been addressed in a secondary bug - unpublished Bug 7914003 'KILL BLOCKER AFTER ORA-494 LEADS TO FATAL BG PROCESS BEING KILLED' which was closed as Not a bug.
In order to prevent a background blocker from being killed, you can set the following init.ora parameter to 1 (default is 3).
_kill_enqueue_blocker=1
With this parameter, if the enqueue holder is a background process, then it will not be killed, therefore the instance will not crash. If the enqueue holder is not a background process, the new 10.2.0.4 mechanism will still try to kill it.
The reason why the blocker interface with ORA-494 is kept is because, in most cases, customers would prefer crashing the instance than having a cluster-wide hang. |
|