oracle查询blocking session阻塞情况

来源:这里教程网 时间:2026-03-03 16:17:59 作者:

    最近生产环境出现大量的由library cache lock和cursor: pin S wait on X这两个等待事件组成的阻塞会话,现场通过kill大量blocking session解决了此问题。由于当时没有及时做errorstack以及systemstat dump,根据mos上troubleshooting的文章去排查并没有发现上面列出的类似的情况而导致此问题。这里梳理了一下查看blocking session阻塞源头以及阻塞的层级关系的SQL。 1.no-rac

select a.*,
       row_number() over(partition by blocking_source order by "LEVEL" asc) as rn
  from (select *
          from (select lpad(' ', (level - 1) * 2, ' ') || sid as sid,
                       serial#,
                       sql_id,
                       paddr,
                       username,
                       event,
                       machine,
                       program,
                       SUBSTR(numtodsinterval(seconds_in_wait, 'second'),
                              12,
                              8) as wait_time,
                       wait_class#,
                       level,
                       blocking_session,
                       (prior sid) as blocking_sid,
                       (prior serial#) as blocking_serial#,
                       (prior sql_id) as blocking_sql_id,
                       sys_connect_by_path(sid, '->') as blocking_path,
                       connect_by_root(sid) as blocking_source
                  from v$session
                 start with blocking_session is null
                connect by (prior sid) = blocking_session)
         where "LEVEL" > 1
        union
        select to_char(sid) as sid,
               serial#,
               sql_id,
               paddr,
               username,
               event,
               machine,
               program,
               SUBSTR(numtodsinterval(seconds_in_wait, 'second'), 12, 8) as wait_time,
               wait_class#,
               1,
               null,
               null,
               null,
               null,
               null,
               sid
          from v$session
         where sid in (select blocking_source
                         from (select wait_class#,
                                      username,
                                      level,
                                      connect_by_root(sid) as blocking_source
                                 from v$session
                                start with blocking_session is null
                               connect by (prior sid) = blocking_session)
                        where "LEVEL" > 1)) a

2.rac

select a.*,
       row_number() over(partition by blocking_source order by "LEVEL" asc) as rn
  from (select *
          from (select  inst_id,
                       lpad(' ', (level - 1) * 2, ' ') || sid as sid,
                       serial#,
                       sql_id,
                       paddr,
                       username,
                       event,
                       machine,
                       program,
                       SUBSTR(numtodsinterval(seconds_in_wait, 'second'),
                              12,
                              8) as wait_time,
                       wait_class#,
                       level,
                       blocking_session,
                       (prior sid) as blocking_sid,
                       (prior serial#) as blocking_serial#,
                       (prior sql_id) as blocking_sql_id,
                       sys_connect_by_path(sid, '->') as blocking_path,
                       connect_by_root(sid) as blocking_source
                  from gv$session
                 start with blocking_session is null
                connect by (prior sid) = blocking_session)
         where "LEVEL" > 1
        union
        select  inst_id,
               to_char(sid) as sid,
               serial#,
               sql_id,
               paddr,
               username,
               event,
               machine,
               program,
               SUBSTR(numtodsinterval(seconds_in_wait, 'second'), 12, 8) as wait_time,
               wait_class#,
               1,
               null,
               null,
               null,
               null,
               null,
               sid
          from gv$session
         where sid in (select blocking_source
                         from (select wait_class#,
                                      username,
                                      level,
                                      connect_by_root(sid) as blocking_source
                                 from gv$session
                                start with blocking_session is null
                               connect by (prior sid) = blocking_session)
                        where "LEVEL" > 1)) a

相关推荐