這幾天新上線項目的WebLogic頻繁出現線程阻塞的狀況,致使客戶端連接超時,影響正常業務辦理。開始覺得遇到了WebLogic的bug,針對相關問題修復補丁後問題依然,因而開始考慮是否數據庫部分有問題,由於每次線程阻塞都與oracle的操做有關。今天再次出現阻塞問題時,查詢了一下數據庫鎖,發現確實存在數據庫鎖,開始懷疑應用中存在問題SQL。因業務不能長時間停滯,故重啓WebLogic解決故障後,檢查應用中鎖涉及的相關SQL語句,未發現問題SQL。因而蒐集一番SQL語句,以備再次出現問題時,經過session的sid查詢出問題SQL的所在。sql
下述SQL語句一部分是從網上陸陸續續找到的,一部分是從oracle書籍中翻到到,整理在這裏。數據庫
兩個查詢數據庫鎖的SQL,第一個顯示了鎖對應的對象都有什麼,好比表名。第二個顯示的信息更多些,好比說鎖什麼時間開始的,當前的狀態爲什麼等等。下述SQL須要具備DBA角色的用戶進行查詢。select b.owner,b.object_name,l.session_id,l.locked_mode
from v$locked_object l, dba_objects b
where b.object_id=l.object_id;
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;session
-- 查詢會話ID
select username,sid,serial# from v$session;oracle
-- 查詢spid
select pro.spid
from v$session ses,v$process pro where ses.sid=xxx and ses.paddr=pro.addr;線程
-- 查詢會話對應sql
SELECT SE.sid,
SE.serial#,
PR.spid,
SE.status,
SUBSTR(SE.program, 1, 10) PROG,
SUBSTR(SE.machine, 1, 10) MACH,
SQ.sql_text
FROM v$session SE, v$sqlarea SQ, v$process PR
WHERE SE.paddr = PR.ADDR(+)
AND SE.sql_address = SQ.address(+)
AND schemaname <> 'SYS'
ORDER BY SE.sid對象
-- 查詢v$session_wait獲取各進程等待事件進程
select sid, event,p1, p1text from v$session_wait;事件
-- 經過已知的session的sid聯合v$session、v$sqltext視圖得到相關session正在執行的完整的SQL語句hash
select a.sql_text from v$sqltext a, v$session b
where a.hash_value=b.sql_hash_value
and b.sid='102';it
-- 檢查SQL的執行計劃 此SQL須要使用執行SQL的用戶進行檢查
set autotrace trace explain;
此處寫入執行的相關SQL,回車,即會顯示SQL的執行計劃。