2015年6月19日 星期五

[OM] ORA-06508 could not find OE_Delayed_Requests_PVT

    透過 API 做 SO Line Split 時,出現 ORA-06508 的錯誤訊息。


    完整錯誤訊息是 ORA-06508: PL/SQL: could not find program unit being called in Package OE_Delayed_Requests_PVT Procedure Process_Request_Pvt。

    遇到 ORA-06508 錯誤,如果 Package Name 沒有打錯,那麼比較常見的原因,就是 Object Invalid,再不然就是有人耍寶,真的把 Package 給 Drop 掉了。

    後者(Drop)發生機率比較低,畢竟家裡現在沒有這麼耍寶的人。前者(Invalid)就好處理了,Compile 一下即可。

    BUT .....,如果是這兩個原因,那也沒什麼好紀錄的了。
    這次遇到的情況,Package 還在(沒被 Drop),Status 也是 Valid,但卻仍發生 ORA-06508,實在我以前也沒遇到過。

    Oracle 要執行 Stored Procedure 時,會將 Object Load 到 Memory 中。而 Process_Request_Pvt 本身算是一個有點大的 Package,且他又會呼叫其他的 Stored Procedure,有被呼叫到的,也會需要 Load 到 Memory 中。當無法被 Load 進到 Memory,Oracle 就找不到他,此時也會出現 ORA-06508。

    所以,第三種情況就是,Object 無法被載入 Memory。
    如果第一次遇到,或者經常性的遇到,那要考慮是不是 Shared Pool Size 不夠,要評估是不是要加大。但我們平常都沒事,突然才遇到,那就有可能是 Fragmentation 造成沒有足夠大塊連續的記憶體空間,可以載入,此時只要 Flush Shared Pool 即可。

    在過去的經歷中,沒有遇到過因為 Shared Pool 問題所產生的 ORA-06508,這次還是第一次遇到。因為以前我幹 DBA 時,每天會在離峰時間做 Flush Shared Pool,每天兩次。犧牲一小段時間的效能(User 通常也不會特別感覺到),換來降低 Shared Pool Size 不足的風險,是非常划得來的。休假結束後,就要叫 DBA 也要做一樣的事情才行。

    這麼倒楣,連假第一天就被 Call,還是第一次遇到的問題,花了兩個多小時才處理完成,該拜拜了 .....

   

   

沒有留言: