查看Oracle中存儲過程長時間被卡住的緣由

1:查V$DB_OBJECT_CACHEsql

SELECT * FROM V$DB_OBJECT_CACHE WHERE name='CUX_OE_ORDER_RPT_PKG' AND LOCKS!='0';數據庫

注意:CUX_OE_ORDER_RPT_PKG 爲存儲過程的名稱。session

發現 locks=2oracle

2:按對象查出sid的值spa

select /*+ rule*/  SID from V$ACCESS WHERE object='CUX_OE_ORDER_RPT_PKG';.net

注意:CUX_OE_ORDER_RPT_PKG 爲存儲過程的名稱。對象

3:查sid,serial#blog

SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='剛纔查到的SID';事件

四、根據會話id(sid),此會話的等待事件:ip

  1. select * from v$session where sid=***;  

event字段即爲等待事件。查詢後咱們發現這個會話等待事件爲SQL*Net message from dblink;在查看會話的logon_time爲兩天前。這個時間遠超過咱們估計時間。

五、根據會話id查看此會話正在執行的sql語句

  1. select sql_text from v$sqlarea where address= (select   sql_address  from v$session where sid=***);  

查詢後發現正在執行的sql語句爲經過dblink到遠程數據庫上A表查詢數據,插入到B表。

六、鏈接遠程數據庫,查詢當前被鎖的對象

  1. select * from v$locked_object lo ,   
  2. all_objects  ao    where lo.OBJECT_ID= ao.object_id ;  

查看後發現遠程數據庫中並無涉及到A、B表被鎖

七、查看遠程數據的會話:

  1. select * from v$session where terminal like '%機器名%'  and program='Oracle.exe'  

使用dblink鏈接遠程數據庫,在遠程數據庫上的會話的program應該是是oracle.exe

查詢後發現,兩個遠程庫有時候根本沒有相關會話,有時候可能有相關會話,但其等待事件是 SQL*Net message from client 遠程庫在等待本地Oracle給他發請求。

 

本地庫等dblink遠程庫,遠程庫等待client消息。看來這個存儲過程是不可能執行完了。

具體什麼緣由形成了,還不清楚。

 

這裏給出的處理方法就是殺死會話


http://blog.csdn.net/fupei/article/details/7325190

具體步驟可參考上面的文章

相關文章
相關標籤/搜索