透過v$wait_chains檢視診斷資料庫hang和Contention
11g之前,通常我們資料庫hang住了之後,我們會對資料庫做hang analyze來進行分析,在11g之後,我們可以透過一個新的檢視v$wait_chains來診斷資料庫hang和contention。在11gR1這個版本里面,Oracle透過diag程式實現了一個功能,每隔3秒做一次本地的hang analyze,每隔10秒做一次global的hang analyze。而這些資訊會存放在記憶體裡面,Oracle把這一塊記憶體稱作”hang analysis cache”。而這一部分記憶體資訊,對我們資料庫診斷hang和contention起著非常重要的作用。而資料庫還有一些特性及工具也需要使用這塊記憶體區域。比如Hang Management, Resource Manager Idle Blocker Kill, SQL Tune Hang Avoidance和pmon清除,還有一些外部工具如Procwatcher。
因為在11gR2的v$session檢視中有一個欄位叫final_blocking_session,這個欄位能夠去檢視最上層的阻塞者。最終的blocker一般都處於wait_chain的頂端。這樣的session才會引起問題。我們先來看看普通的查詢.首先隨便製造兩個session共同更新一行的情況。
SELECT chain_id, num_waiters, in_wait_secs, osid, blocker_osid, substr(wait_event_text,1,30) FROM v$wait_chains;
set pages 1000
set lines 120
set heading off
column w_proc format a50 tru
column instance format a20 tru
column inst format a28 tru
column wait_event format a50 tru
column p1 format a16 tru
column p2 format a16 tru
column p3 format a15 tru
column Seconds format a50 tru
column sincelw format a50 tru
column blocker_proc format a50 tru
column fblocker_proc format a50 tru
column waiters format a50 tru
column chain_signature format a100 wra
column blocker_chain format a100 wra
SELECT *
FROM (SELECT 'Current Process: '||osid W_PROC, 'SID '||i.instance_name INSTANCE,
'INST #: '||instance INST,'Blocking Process: '||decode(blocker_osid,null,'',blocker_osid)||
' from Instance '||blocker_instance BLOCKER_PROC,
'Number of waiters: '||num_waiters waiters,
'Final Blocking Process: '||decode(p.spid,null,'',
p.spid)||' from Instance '||s.final_blocking_instance FBLOCKER_PROC,
'Program: '||p.program image,
'Wait Event: ' ||wait_event_text wait_event, 'P1: '||wc.p1 p1, 'P2: '||wc.p2 p2, 'P3: '||wc.p3 p3,
'Seconds in Wait: '||in_wait_secs Seconds, 'Seconds Since Last Wait: '||time_since_last_wait_secs sincelw,
'Wait Chain: '||chain_id ||': '||chain_signature chain_signature,'Blocking Wait Chain: '||decode(blocker_chain_id,null,
'',blocker_chain_id) blocker_chain
FROM v$wait_chains wc,
gv$session s,
gv$session bs,
gv$instance i,
gv$process p
WHERE wc.instance = i.instance_number (+)
AND (wc.instance = s.inst_id (+) and wc.sid = s.sid (+)
and wc.sess_serial# = s.serial# (+))
AND (s.final_blocking_instance = bs.inst_id (+) and s.final_blocking_session = bs.sid (+))
AND (bs.inst_id = p.inst_id (+) and bs.paddr = p.addr (+))
AND ( num_waiters > 0
OR ( blocker_osid IS NOT NULL
AND in_wait_secs > 10 ) )
ORDER BY chain_id,
num_waiters DESC)
WHERE ROWNUM < 101;
使用final_blocking_session欄位,能查到最上端的阻塞程式。
set pages 1000
set lines 120
set heading off
column w_proc format a50 tru
column instance format a20 tru
column inst format a28 tru
column wait_event format a50 tru
column p1 format a16 tru
column p2 format a16 tru
column p3 format a15 tru
column Seconds format a50 tru
column sincelw format a50 tru
column blocker_proc format a50 tru
column fblocker_proc format a50 tru
column waiters format a50 tru
column chain_signature format a100 wra
column blocker_chain format a100 wra
SELECT *
FROM (SELECT 'Current Process: '||osid W_PROC, 'SID '||i.instance_name INSTANCE,
'INST #: '||instance INST,'Blocking Process: '||decode(blocker_osid,null,'',blocker_osid)||
' from Instance '||blocker_instance BLOCKER_PROC,
'Number of waiters: '||num_waiters waiters,
'Final Blocking Process: '||decode(p.spid,null,'',
p.spid)||' from Instance '||s.final_blocking_instance FBLOCKER_PROC,
'Program: '||p.program image,
'Wait Event: ' ||wait_event_text wait_event, 'P1: '||wc.p1 p1, 'P2: '||wc.p2 p2, 'P3: '||wc.p3 p3,
'Seconds in Wait: '||in_wait_secs Seconds, 'Seconds Since Last Wait: '||time_since_last_wait_secs sincelw,
'Wait Chain: '||chain_id ||': '||chain_signature chain_signature,'Blocking Wait Chain: '||decode(blocker_chain_id,null,
'',blocker_chain_id) blocker_chain
FROM v$wait_chains wc,
gv$session s,
gv$session bs,
gv$instance i,
gv$process p
WHERE wc.instance = i.instance_number (+)
AND (wc.instance = s.inst_id (+) and wc.sid = s.sid (+)
and wc.sess_serial# = s.serial# (+))
AND (s.final_blocking_instance = bs.inst_id (+) and s.final_blocking_session = bs.sid (+))
AND (bs.inst_id = p.inst_id (+) and bs.paddr = p.addr (+))
AND ( num_waiters > 0
OR ( blocker_osid IS NOT NULL
AND in_wait_secs > 10 ) )
ORDER BY chain_id,
num_waiters DESC)
WHERE ROWNUM < 101;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14377/viewspace-2286915/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Oracle】資料庫hang 診斷Oracle資料庫
- 利用hanganalyz/systemstate dump診斷資料庫hang資料庫
- enq: HW - contention診斷及解決過程ENQ
- 透過sql檢視資料庫有哪些程式在工作SQL資料庫
- 如何診斷oracle資料庫執行緩慢或hang住的問題Oracle資料庫
- 檢視和診斷JVM執行緒資訊JVM執行緒
- mysql資料庫效能診斷MySql資料庫
- Oracle配置資料庫診斷Oracle資料庫
- V$SQL檢視顯示結果異常的診斷SQL
- Part II 診斷和優化資料庫效能優化資料庫
- 資料庫診斷一例資料庫
- Oracle效能診斷檢視總結Oracle
- 透過作業系統的程式號檢視資料庫的session作業系統資料庫Session
- 透過shell指令碼檢視資料庫表空間使用情況指令碼資料庫
- 透過v$parameter 檢視 issys_modifiable 狀態判斷是否動態引數
- 如何診斷等待事件 enq: HW - contention事件ENQ
- 2 Day DBA-管理方案物件-監控和優化資料庫-效能自我診斷:自動資料庫診斷監控物件優化資料庫
- 通過awk、sed檢視listener.log診斷logon on stormGoORM
- 透過閃回事務檢視資料dml的情況
- 資料庫異常智慧分析與診斷資料庫
- ODX 診斷資料庫轉換工具 — DDC資料庫
- 診斷Oracle資料庫Hanging問題Oracle資料庫
- 透過v$sql_bind_capture 檢視繫結變數。SQLAPT變數
- 資料庫HANG著資料庫
- 資料庫檢視資料庫
- 資料庫-檢視資料庫
- 11G訪問DBA_OBJECTS和V$LOCK檢視時HANG住Object
- android 檢視資料庫和shaedpreference資料框架Android資料庫框架
- 【GP】透過資料字典檢視某個表的欄位
- PHP 資料型別之檢視和判斷資料型別PHP資料型別
- 透過等待看資料庫資料庫
- 大語言模型與資料庫故障診斷模型資料庫
- MySQL資料庫診斷:InnoDB關機問題MySql資料庫
- 使用awr來診斷資料庫效能問題資料庫
- 自管理的資料庫:自動效能診斷資料庫
- Oracle___診斷案例__資料庫的exp故障Oracle資料庫
- 使用SQL_TRACE進行資料庫診斷SQL資料庫
- ORACLE 如何診斷高水位爭用(enq: HW – contention)OracleENQ