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
event字段即爲等待事件。查詢後咱們發現這個會話等待事件爲SQL*Net message from dblink;在查看會話的logon_time爲兩天前。這個時間遠超過咱們估計時間。
五、根據會話id查看此會話正在執行的sql語句
查詢後發現正在執行的sql語句爲經過dblink到遠程數據庫上A表查詢數據,插入到B表。
六、鏈接遠程數據庫,查詢當前被鎖的對象
查看後發現遠程數據庫中並無涉及到A、B表被鎖
七、查看遠程數據的會話:
使用dblink鏈接遠程數據庫,在遠程數據庫上的會話的program應該是是oracle.exe
查詢後發現,兩個遠程庫有時候根本沒有相關會話,有時候可能有相關會話,但其等待事件是 SQL*Net message from client 遠程庫在等待本地Oracle給他發請求。
本地庫等dblink遠程庫,遠程庫等待client消息。看來這個存儲過程是不可能執行完了。
具體什麼緣由形成了,還不清楚。
這裏給出的處理方法就是殺死會話
http://blog.csdn.net/fupei/article/details/7325190
具體步驟可參考上面的文章