MOS 上有一篇文章專門介紹這個問題,參考:[ID 779552.1]。
在Oracle 10.2.0.4版本中,alert log 可能出現如下錯誤:
ORA-00494:enqueue [CF] held for too long (more than 900 seconds)
這個錯誤,通常和ORA-600 [2103] 一起出現。 他們的產生的原因都是一樣的。進程在指定時間內(預設900秒)不能擷取CF 隊列。
一般只在系統高負載,高並發,IO 等待和爭奪時,Oracle進程佔有相關資源沒有釋放造成。
有2個bug 可能導致這個問題:
(1)Bug7692631 - 'DATABASE CRASHES WITH ORA-494 AFTER UPGRADE TO 10.2.0.4'
(2)unpublished Bug 7914003 'KILL BLOCKER AFTER ORA-494 LEADS TO FATALBG PROCESS BEING KILLED'
解決方案:
在10.2.0.4 的Oracle 的機制中會kill 所有block的進程,包括後台進程和非後台進程。 要注意的是:
(1) 如果是非後台進程holder 了CF enqueue,那麼kill 該進程,那麼執行個體還可以正常運行。
(2)如果是後台進程,如LGWR holder了,那麼kill LGWR 將會導致db crash。
為了避免kill 掉blocker 進程(後台和非後台進程),可以設定參數:
_kill_controlfile_enqueue_blocker=false.
這樣所有blocker 進程都不會被kill 掉。即使該進程hold 了enqueue 很長時間。一般來說,最好的情況是避免kill 後台進程,允許kill 非後台進程。
為了阻止後台進程被kill,可以在init.ora 檔案裡設定參數:_kill_enqueue_blocker=1,該參數預設值為3.
當設定該參數之後,如果enqueue 被後台進程holder,該後台進程不會給kill。 所以執行個體不會crash。 如果enqueue被非後台進程holder,那麼10.2.0.4 的機制還是會嘗試去kill 非後台進程。
Oracle保留ORA-494 的原因是使用者更傾向於instance crash,如果不crash,db 就會hang住。
-------------------------------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
Email: dvd.dba@gmail.com
DBA1 群:62697716(滿); DBA2 群:62697977(滿) DBA3 群:62697850(滿)
DBA 超級群:63306533(滿); DBA4 群: 83829929 DBA5群: 142216823
DBA6 群:158654907 聊天 群:40132017 聊天2群:69087192
--加群需要在備忘說明Oracle資料表空間和資料檔案的關係,否則拒絕申請