记一次Oracle数据库死锁

网友投稿 766 2022-10-04

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

记一次Oracle数据库死锁

查询活动会话信息

前言

本文不讲什么是锁,主要记录一次针对实际场景进行的分析判断。

一、简介

应用的人找来说某重要系统功能再次出现了问题,请求杀掉堵塞的会话。

二、分析处理过程

1. 查询活动会话信息

查询sql见 变更支持中的二、查询活动会话信息输出如下:

死锁.png

在4号节点上,堵塞sid为23041的会话的会话sid为10625,堵塞sid为10625的会话的会话sid为23041,是死锁无疑了。也可用以下sql直接查询有无死锁

SELECT G1.INST_ID, G1.SID || ',' || G1.SERIAL# SID#, G1.MACHINE, G1.USERNAME, G1.TYPE EVENT, G1.STATE, G1.WAIT_TIME_MICRO, G1.BLOCKING_INSTANCE || ( CASE WHEN G1.BLOCKING_INSTANCE IS NULL THEN NULL ELSE ',' END ) || G1.BLOCKING_SESSION BL_SESS, G1.FINAL_BLOCKING_INSTANCE || ( CASE WHEN G1.FINAL_BLOCKING_INSTANCE IS NULL THEN NULL ELSE ',' END ) || G1.FINAL_BLOCKING_SESSION FI_BL_SESS, G1.FINAL_BLOCKING_SESSION_STATUS, G1.STATUS, G1.COMMAND, G1.SQL_IDFROM GV$SESSION G1, GV$SESSION G2WHERE G1.BLOCKING_INSTANCE = G2.INST_ID AND G1.BLOCKING_SESSION = G2.SID AND G2.BLOCKING_INSTANCE = G1.INST_ID AND G2.BLOCKING_SESSION = G1.SID AND G1.WAIT_CLASS# <> 6 AND G2.WAIT_CLASS# <> 6;

若有输出,则存在死锁。

2. 找出具体sql给应用

在我们的活动会话及死锁查询sql中,有一个sql_id列,根据sql_id列获得sql_id,通过视图gv$sql获得sql文本,查询语句如下:

SELECT SQL_ID, SQL_TEXTFROM GV$SQLWHERE SQL_ID = '&SQL_ID';

找出sql文本如下:

UPDATE XXXSET A= :B1, B = SYSDATEWHERE 1 = 1 AND C = :B5 AND D = TO_NUMBER(:B4) AND E = :B3 AND F = :B2;

sql中使用了:B1、:B2之类的绑定变量,应用想进一步知道这些绑定变量的值,以便定位到是哪个模块导致了死锁。查询视图gv$sql_bind_capture获取绑定变量的具体值,

SELECT *FROM GV$SQL_BIND_CAPTUREWHERE SQL_ID = '&SQL_ID';

三、结尾

应用将相关模块停掉重启应用,数据库上查询活动会话无死锁出现,连堵塞的会话都没有了。

上一篇:王莽简传
下一篇:亚马逊已研发出第二代 AI 芯片?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~