分析历史锁,主要还是依赖历史活动会话视图v$active_session_history,它默认是每1s抓取一次活动会话,保留24小时左右,重启后会清空。还有一个dba_hist_active_sess_history视图每次抓取间隔10s,保留大概7天左右。
上述视图仅供参考,分析主要依赖于上述视图的blocking_session、sql_id、event 、PROGRAM列
分析思路,找到阻塞的会话和被阻塞会话的sql和等待事件确定阻塞原因,blocking_session列有值代表当前会话被blocking_session列的sid阻塞的。
确认指定时间段中时间点阻塞排行,找到最高或告警时间点的SAMPLE_ID(同一id可以理解为同一时间被抓取记录的信息)
select SAMPLE_ID,SAMPLE_TIME,count(*) from v$active_session_history
where SAMPLE_TIME between to_date('2024-06-20 0:05:00','YYYY/MM/DD hh24:mi:ss') and to_date('2024-06-20 0:07:00','YYYY/MM/DD hh24:mi:ss')
and blocking_session is not null
group by SAMPLE_ID,SAMPLE_TIME having count(*) > 10 order by count(*) desc |
查看具体时间点活动会话信息,注意blocking_session是谁阻塞的,并核实blocking_session去对应sid查看阻塞会话的源头在做什么
select a.session_id,a.session_serial#,a.sql_id,sql_child_number,a.blocking_session,a.blocking_session_serial#,PROGRAM,a.event from v$active_session_history a where SAMPLE_ID = 169951227; |
显示SQLID信息和SQL语句还有变量信息 --- RAC可用
select a.sql_id,
a.child_number,
a.sql_fulltext /*sql字符小于4000可以直接to_char(b.sql_fulltext)*/,
b.value_string
from gv$sql a left join (select distinct sql_id,
child_number,
listagg(name || '=' || value_string, ',') within group(order by name || value_string) over(partition by sql_id, child_number) value_string
from (select distinct sql_id, child_number, name, value_string
from gv$sql_bind_capture)) b
on a.sql_id = b.sql_id
and a.child_number = b.child_number
where a.sql_id = '1ksxm7h0t95pq' and a.child_number=790 |
查看阻塞的会话在做啥
select a.sample_id,a.sample_time,a.session_id,a.sql_id,a.sql_child_number scn,a.sql_exec_start,a.event,a.session_state,a.program,BLOCKING_SESSION,
a.action,a.machine from v$active_session_history a where session_id=1160 and session_serial#=26801; |
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




