oracle 锁查询

先看一个数据库监控图:这上面的信息中,怎么判断XX会话被另一个会话堵塞呢?
如果用网上的判断死锁sql去查询,类似如下:思考了一段时间,决定从gv$session入手,下面先看第一条sql

1、查看活动会话信息
--查看活动会话信息
SELECT INST_ID,
       SID,
       SERIAL#,
       PROCESS,
       USERNAME,
       LOCKWAIT,
       SCHEMANAME,
       OSUSER,
       MACHINE,
       PROGRAM,
       SQL_ID,
       MODULE,
       ACTION,
       LOGON_TIME,
       BLOCKING_SESSION_STATUS,
       BLOCKING_INSTANCE,
       BLOCKING_SESSION,
       EVENT,
       WAIT_CLASS,
       SECONDS_IN_WAIT,
       STATE
  FROM GV$SESSION
 WHERE USERNAME IS NOT NULL
   AND STATUS = 'ACTIVE'
 ORDER BY LOGON_TIME, SID;

2、查看当前被阻塞lock信息(waiter)

--注:如果state值为Waiting,那么wait_time值无用。Second_in_wait值是实际的等待时间(单位:秒)。
--如果state值为Wait unknow time,那么wait_time值和Second_in_wait值都无用。
--如果state值为Wait short time,那么wait_time值和Second_in_wait值都无用。
--如果state值为Waiting known time,那么wait_time值就是实际等待时间(单位:秒),Second_in_wait值无用。

SELECT INST_ID "实例ID",
       SID,
       SERIAL#,
       PROCESS,
       USERNAME,
       SCHEMANAME,
       OSUSER,
       MACHINE,
       PROGRAM,
       SQL_ID,
       MODULE,
       ACTION,
       LOCKWAIT,
       BLOCKING_SESSION_STATUS,
       BLOCKING_INSTANCE "阻塞会话实例",
       BLOCKING_SESSION "阻塞会话SID",
       EVENT "等待事件",
       WAIT_CLASS,
       LOGON_TIME,
       CASE
         WHEN STATE = 'WAITING' THEN
          SECONDS_IN_WAIT
         WHEN STATE = 'WAITING KNOWN TIME' THEN
          WAIT_TIME
       END AS "等待时间(s)",
       STATE
  FROM GV$SESSION
 WHERE USERNAME IS NOT NULL
   AND STATUS = 'ACTIVE'
   AND LOCKWAIT IS NOT NULL;

因为想尽量放在一条sql把需要的信息都展示出来,所以字段会比较多。

3、查看阻塞会话SID信息(holder)
--考虑到多实例会存在sid一致的情况,所以加了实例区分
SELECT INST_ID "实例ID",
       SID,
       SERIAL#,
       PROCESS,
       USERNAME,
       SCHEMANAME,
       OSUSER,
       MACHINE,
       PROGRAM,
       SQL_ID,
       MODULE,
       ACTION,
       LOCKWAIT,
       BLOCKING_SESSION_STATUS,
       BLOCKING_INSTANCE,
       BLOCKING_SESSION "阻塞会话SID",
       EVENT "等待事件",
       WAIT_CLASS,
       LOGON_TIME,
       CASE
         WHEN STATE = "WAITING" THEN
          SECONDS_IN_WAIT
         WHEN STATE = "WAITING KNOWN TIME" THEN
          WAIT_TIME
       END AS '等待时间(s),
       STATE
  FROM GV$SESSION
 WHERE INST_ID = "&INSTANCE"
   and SID = "&SID";

4、查看会话ID在执行什么sql
select sid, sql_text
  from v$session a, v$sql b
 where sid in (&sid)
   and (b.sql_id = a.sql_id or b.sql_id = a.prev_sql_id);

5、查看SQL_ID相关sql
select listagg(sql_text, " ") within group(order by piece)
  from v$sqltext
 where sql_id = "&sqlid"
 group by sql_id

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹蜻蜓vYv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值