数据库发生了堵塞,例如大量latch free,大量log file sync, 大量enq , 需要尽快查看并备份当前的v$active_session_history表,以免1s一次的统计数据被覆盖。 被覆盖后只能查dba_hist_active_sess_history,根据snapshot的频率不同(一般15分钟一次)而记录的历史统计数据。
关键点: 找到大量堵塞event的holder,看holder在等待什么。 被阻塞的可能只是现象,阻塞别人的才是原因。 比较典型的是一大堆的log file sync,但是最后发现holder在等待buffer busy waits,最终还是sql的效率问题。
分析方法举例:
阻塞别的session最多的前3位是session 2175,2748,2040:
select sample_time,blocking_session,count(*) from v$active_session_history
where sample_id=169320437
group by sample_time,blocking_session order by 3 desc
;
峰值时刻:16:20:46
阻塞别的session最多的前3位session是:528,1432,1156:
select blocking_session,count(*) from v$active_session_history
where sample_time>=to_date('2014-08-15 16:20:46','yyyy-mm-dd hh24:mi:ss')
and sample_time<=to_date('2014-08-15 16:20:47','yyyy-mm-dd hh24:mi:ss')
group by blocking_session order by 2 desc
观察其这一时刻的blocking session链条:
--如462(enq: TX - index contention) -> 2175(buffer busy waits) ->2304(buffer busy waits)
--如581(log file sync)->2748(log file parallel write)
--如824(buffer busy waits) ->2040(enq: TX - index contention) -> 2175(buffer busy waits) ->2304(buffer busy waits)