当前位置: 首页 > article >正文

oracle查看锁阻塞-谁阻塞了谁

一 模拟锁阻塞

#阻塞1

一个会话正在往一个大表写入大量数据的时候,另一个会话加字段:

#会话1

a50e3ead1b084e0a8f472d668c7a5fa8.png

#会话2

51bc80b2975c4df5894ee0eebec5f07e.png

会话2被阻塞了。

 

#阻塞2

模拟一个会话update一条记录,没提交。

6a4a5eaa652d4105b23bee4ecd90b0a5.png

另一个会话也update这一条记录:

ddfbe9fea5c34b07abc8db082d9b0e0d.png

会话2被阻塞了。

二 简单查看阻塞链

select *
  from (select a.inst_id,a.sid, a.serial#,
               a.sql_id,
               a.event,
               a.status,
               connect_by_isleaf as isleaf,
               sys_connect_by_path(SID, '<-') tree,
               level as tree_level
          from gv$session a
         start with a.blocking_session is not null
        connect by nocycle a.sid = prior a.blocking_session)
 where isleaf = 1
 order by tree_level asc;

输出示例:

ac4b568f6a144d73a5923f2865f73d79.png

TREE这里可以看到阻塞链(从右往左看),这里是:

978阻塞了729;

372阻塞了616。

三 查看具体谁阻塞了谁

SELECT DISTINCT s1.inst_id as blocking_inst_id,s1.username as blocking_username,s1.machine as blocking_machine,s1.module as blocking_module,s1.sid as blocking_sid,s1.audsid as blocking_audsid,s1.serial# as blocking_serial#,c1.sql_text as blocking_sql_text,s1.status as blocking_staus,s1.event as blocking_event,
s2.inst_id as waiting_inst_id,s2.username as waiting_username,s2.machine waiting_machine,s2.module as waiting_module,s2.sid as waiting_sid,s2.audsid as waiting_audsid,s2.serial# as waiting_serial#,c2.sql_text as waiting_sql_text,s2.status as blocking_staus,s2.event as waiting_event
  FROM gv$lock l1,
       gv$session s1,
       gv$lock l2,
       gv$session s2,
       gv$sqlarea c1,
       gv$sqlarea c2,
       gv$process b1,
       gv$process b2
 WHERE     s1.sid = l1.sid
       AND s2.sid = l2.sid
       AND s1.inst_id = l1.inst_id
       AND s2.inst_id = l2.inst_id
       AND s1.paddr = b1.addr
       AND s2.paddr = b2.addr
       AND c1.SQL_ID=s1.PREV_SQL_ID       
       AND s2.sql_hash_value = c2.hash_value
       AND l1.block > 0
       AND l2.request > 0
       AND l1.id1 = l2.id1
       AND l1.id2 = l2.id2
UNION
SELECT DISTINCT s1.inst_id as blocking_inst_id,s1.username as blocking_username,s1.machine as blocking_machine,s1.module as blocking_module,s1.sid as blocking_sid,s1.audsid as blocking_audsid,s1.serial# as blocking_serial#,c1.sql_text as blocking_sql_text,s1.status as blocking_staus,s1.event as blocking_event,
s2.inst_id as waiting_inst_id,s2.username as waiting_username,s2.machine waiting_machine,s2.module as waiting_module,s2.sid as waiting_sid,s2.audsid as waiting_audsid,s2.serial# as waiting_serial#,c2.sql_text as waiting_sql_text,s2.status as blocking_staus,s2.event as waiting_event
  FROM gv$lock l1,
       gv$session s1,
       gv$lock l2,
       gv$session s2,
       gv$sqlarea c1,
       gv$sqlarea c2,
       gv$process b1,
       gv$process b2
 WHERE     s1.sid = l1.sid
       AND s2.sid = l2.sid
       AND s1.inst_id = l1.inst_id
       AND s2.inst_id = l2.inst_id
       AND s1.paddr = b1.addr
       AND s2.paddr = b2.addr
       AND c1.hash_value=s1.sql_hash_value
       AND c1.address=s1.sql_address
       AND s2.sql_hash_value = c2.hash_value
       AND l1.block > 0
       AND l2.request > 0
       AND l1.id1 = l2.id1
       AND l1.id2 = l2.id2

#备注

union前的sql可以查看源端执行过的sql(在一个事务里执行了,但是还没提交)。

union后的sql可以查看当前源端正在执行的sql。

一次性展示不全,这里分三个截图展示:

e8298001c9254cf7aeb8dc2299b4dafb.png

在每条记录里可以看到是谁阻塞了谁。

但是假如源端执行了这个事务后,又执行了其他事务,这时候查看源端阻塞sql就不准确了,这里只能查到源端执行的事务里的最后一条sql。

示例:

源端执行了一个事务,然后有执行了一个其他的sql,这时查看源端的阻塞sql是这样的:

f99460d8c8944c5e84f8b0b7f1e1e916.png

这时结果是不准确的。假如想进一步排查,则可以对这个表进行下审计,审计阻塞方会话对这个表都做了什么操作,详细可参考

https://blog.csdn.net/YABIGNSHI/article/details/143970533

 

 

 

 


http://www.kler.cn/a/407252.html

相关文章:

  • 【SLAM文献阅读】基于概率模型的视觉SLAM动态检测与数据关联方法
  • go 结构体方法
  • Ubuntu下安装Qt
  • 工程企业需要什么样的物资管理系统?为什么需要物资管理系统?
  • LWE详细介绍
  • 网络安全的学习方向和路线是怎么样的?
  • 【AIGC】大模型面试高频考点-RAG篇
  • 深度学习:神经网络的搭建
  • Python实现随机分布式延迟PSO优化算法(RODDPSO)优化CNN回归模型项目实战
  • Android学生信息管理APP的设计与开发
  • Webpack 热更新(HMR)详解:原理与实现
  • 学习嵩山版《Java 开发手册》:编程规约 - 命名风格(P1 ~ P2)
  • 如何进行Apache的配置与调试?
  • Centos环境安装Docker
  • 谈谈法律专业留学dissertation的写作原则与要求
  • 基于Java Springboot高校奖助学金系统
  • el-table表格展示和传值分隔写法
  • SpringCloud Gateway转发请求到同一个服务的不同端口
  • 大模型(LLMs)增量预训练篇
  • Rust 智能指针