透過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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Part II 診斷和優化資料庫效能優化資料庫
- ORACLE 如何診斷高水位爭用(enq: HW – contention)OracleENQ
- ODX 診斷資料庫轉換工具 — DDC資料庫
- 資料庫異常智慧分析與診斷資料庫
- android 檢視資料庫和shaedpreference資料框架Android資料庫框架
- 資料庫檢視資料庫
- 資料庫-檢視資料庫
- 大語言模型與資料庫故障診斷模型資料庫
- 透過v$sql_bind_capture 檢視繫結變數。SQLAPT變數
- PHP 資料型別之檢視和判斷資料型別PHP資料型別
- 透過等待看資料庫資料庫
- 使用SQL_TRACE進行資料庫診斷(轉)SQL資料庫
- 2.12 資料庫資料字典檢視資料庫
- MySQL使用event等待事件進行資料庫效能診斷MySql事件資料庫
- 資料庫的物化檢視資料庫
- openGausspostgreSQL資料庫效能檢視SQL資料庫
- 資料庫檢視的作用資料庫
- 資料庫檢視的使用資料庫
- file-max設定過小導致oracle資料庫hang住Oracle資料庫
- Alibaba Java診斷工具Arthas檢視Dubbo動態代理類Java
- MySQL命令檢視資料庫和表容量大小MySql資料庫
- 如何透過SQLyog分析MySQL資料庫MySql資料庫
- 資料庫簡化運維,智慧診斷助手幫你搞定!資料庫運維
- sqlplus -prelim和oradebug捕獲資料庫hang住的詳細資訊SQL資料庫
- Linux 系統如何透過 netstat 命令檢視連線數判斷攻擊Linux
- 如何透過鏈路追蹤進行定時任務診斷
- 【資料庫資料恢復】透過資料頁恢復Sql Server資料庫資料的過程資料庫資料恢復SQLServer
- mysql binlog檢視指定資料庫MySql資料庫
- 什麼是資料庫檢視?資料庫
- 【磐維資料庫】透過python訪問磐維資料庫資料庫Python
- oracle之 redo過高診斷Oracle
- 【YashanDB資料庫】PHP無法透過ODBC連線到資料庫資料庫PHP
- Android資料庫檢視庫---Android-Debug-DatabaseAndroid資料庫Database
- 檢視oracle資料庫真實大小Oracle資料庫
- 資料庫檢視,索引,觸發器資料庫索引觸發器
- 2.8.3 資料庫服務的資料字典檢視資料庫
- 【巨杉資料庫SequoiaDB】巨杉Tech | 四步走,快速診斷資料庫叢集狀態資料庫
- 如何透過一條資料庫語句做資料分析資料庫