標籤:本地 ddr tail 串連 tle 步驟 sql lin term
1:查V$DB_OBJECT_CACHE
SELECT * FROM V$DB_OBJECT_CACHE WHERE name=‘CUX_OE_ORDER_RPT_PKG‘ AND LOCKS!=‘0‘;
注意:CUX_OE_ORDER_RPT_PKG 為預存程序的名稱。
發現 locks=2
2:按對象查出sid的值
select /*+ rule*/ SID from V$ACCESS WHERE object=‘CUX_OE_ORDER_RPT_PKG‘;
注意:CUX_OE_ORDER_RPT_PKG 為預存程序的名稱。
3:查sid,serial#
SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID=‘剛才查到的SID‘;
4、根據會話id(sid),此會話的等待事件:
[sql] view plain copy
- select * from v$session where sid=***;
event欄位即為等待事件。查詢後我們發現這個會話等待事件為SQL*Net message from dblink;在查看會話的logon_time為兩天前。這個時間遠超過我們估計時間。
5、根據會話id查看此會話正在執行的sql語句
[sql] view plain copy
- select sql_text from v$sqlarea where address= (select sql_address from v$session where sid=***);
查詢後發現正在執行的sql語句為通過dblink到遠端資料庫上A表查詢資料,插入到B表。
6、串連遠端資料庫,查詢當前被鎖的對象
[sql] view plain copy
- select * from v$locked_object lo ,
- all_objects ao where lo.OBJECT_ID= ao.object_id ;
查看後發現遠端資料庫中並沒有涉及到A、B表被鎖
7、查看遠端資料的會話:
[sql] view plain copy
- 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
具體步驟可參考上面的文章
查看Oracle中預存程序長時間被卡住的原因