Oracle 死锁的检测查询及处理


Posted in Oracle onSeptember 25, 2021

死锁查询语句:

-- 死锁查询语句
SELECT    bs.username "Blocking User", bs.username "DB User",
          ws.username "Waiting User", bs.SID "SID", ws.SID "WSID",
          bs.serial# "Serial#", bs.sql_address "address",
          bs.sql_hash_value "Sql hash", bs.program "Blocking App",
          ws.program "Waiting App", bs.machine "Blocking Machine",
          ws.machine "Waiting Machine", bs.osuser "Blocking OS User",
          ws.osuser "Waiting OS User", bs.serial# "Serial#",
          ws.serial# "WSerial#",
          DECODE (wk.TYPE,
                  'MR', 'Media Recovery',
                  'RT', 'Redo Thread',
                  'UN', 'USER Name',
                  'TX', 'Transaction',
                  'TM', 'DML',
                  'UL', 'PL/SQL USER LOCK',
                  'DX', 'Distributed Xaction',
                  'CF', 'Control FILE',
                  'IS', 'Instance State',
                  'FS', 'FILE SET',
                  'IR', 'Instance Recovery',
                  'ST', 'Disk SPACE Transaction',
                  'TS', 'Temp Segment',
                  'IV', 'Library Cache Invalidation',
                  'LS', 'LOG START OR Switch',
                  'RW', 'ROW Wait',
                  'SQ', 'Sequence Number',
                  'TE', 'Extend TABLE',
                  'TT', 'Temp TABLE',
                  wk.TYPE
                 ) lock_type,
          DECODE (hk.lmode,
                  0, 'None',
                  1, 'NULL',
                  2, 'ROW-S (SS)',
                  3, 'ROW-X (SX)',
                  4, 'SHARE',
                  5, 'S/ROW-X (SSX)',
                  6, 'EXCLUSIVE',
                  TO_CHAR (hk.lmode)
                 ) mode_held,
          DECODE (wk.request,
                  0, 'None',
                  1, 'NULL',
                  2, 'ROW-S (SS)',
                  3, 'ROW-X (SX)',
                  4, 'SHARE',
                  5, 'S/ROW-X (SSX)',
                  6, 'EXCLUSIVE',
                  TO_CHAR (wk.request)
                 ) mode_requested,
          TO_CHAR (hk.id1) lock_id1, TO_CHAR (hk.id2) lock_id2,
          DECODE
             (hk.BLOCK,
              0, 'NOT Blocking',          /**//* Not blocking any other processes */
              1, 'Blocking',              /**//* This lock blocks other processes */
              2, 'Global',           /**//* This lock is global, so we can't tell */
              TO_CHAR (hk.BLOCK)
             ) blocking_others
     FROM v$lock hk, v$session bs, v$lock wk, v$session ws
    WHERE hk.BLOCK = 1
      AND hk.lmode != 0
      AND hk.lmode != 1
      AND wk.request != 0
      AND wk.TYPE(+) = hk.TYPE
      AND wk.id1(+) = hk.id1
      AND wk.id2(+) = hk.id2
      AND hk.SID = bs.SID(+)
      AND wk.SID = ws.SID(+)
      AND (bs.username IS NOT NULL)
      AND (bs.username <> 'SYSTEM')
      AND (bs.username <> 'SYS')
ORDER BY 1;

查询发生死锁的select语句

select sql_text from v$sql where hash_value in (
    select sql_hash_value from v$session where sid in (select session_id from v$locked_object)
)

一、关于数据库死锁的检查方法

1、数据库死锁的现象

程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。

2、死锁的原理

当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。

3、死锁的定位方法

通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。

 1)用dba用户执行以下语句

select username,lockwait,status,machine,program from v$session where sid 
in (select session_id from v$locked_object)

如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:
Username:死锁语句所用的数据库用户;
Lockwait:死锁的状态,如果有内容表示被死锁。
Status: 状态,active表示被死锁
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。

2)用dba用户执行以下语句,可以查看到被死锁的语句

select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))

4、死锁的解决方法

     一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。用户可能不知道产生死锁的语句是哪一句。可以将程序关闭并重新启动就可以了。经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。

 1)查找死锁的进程:

sqlplus "/as sysdba" (sys/change_on_install)
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS 
FROM V$LOCKED_OBJECT l,V$SESSION S 
WHERE l.SESSION_ID=S.SID;

2)kill掉这个死锁的进程:

alter system kill session ‘sid,serial#'; (其中sid=l.session_id)

 3)如果还不能解决:

select pro.spid from v$session ses, v$process pro where ses.sid=XX and ses.paddr=pro.addr;

其中sid用死锁的sid替换:

exit
       ps -ef|grep spid

 其中spid是这个进程的进程号,kill掉这个Oracle进程。

到此这篇关于Oracle 死锁的检测查询及处理的文章就介绍到这了,更多相关Oracle 死锁的检测查询及处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Oracle 相关文章推荐
Oracle笔记
Apr 05 Oracle
使用springboot暴露oracle数据接口的问题
May 07 Oracle
Oracle更换为MySQL遇到的问题及解决
May 21 Oracle
Oracle创建只读账号的详细步骤
Jun 07 Oracle
使用Oracle跟踪文件的问题详解
Jun 28 Oracle
快速学习Oracle触发器和游标
Jun 30 Oracle
Oracle表空间与权限的深入讲解
Nov 17 Oracle
详解Oracle数据库中自带的所有表结构(sql代码)
Nov 20 Oracle
Oracle 触发器trigger使用案例
Feb 24 Oracle
详解SQL的窗口函数
Apr 21 Oracle
分析SQL窗口函数之聚合窗口函数
Apr 21 Oracle
在Oracle表中进行关键词搜索的过程
Jun 10 Oracle
RPM包方式安装Oracle21c的方法详解
oracle连接ODBC sqlserver数据源的详细步骤
Oracle以逗号分隔的字符串拆分为多行数据实例详解
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
ORACLE查看当前账号的相关信息
You might like
文章推荐系统(二)
2006/10/09 PHP
php 保留字列表
2012/10/04 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
PHP检测一个数组有没有定义的方法步骤
2019/07/20 PHP
php中关于换行的实例写法
2019/09/26 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
2021/01/28 Javascript
python简单线程和协程学习心得(分享)
2017/06/14 Python
Python实现的爬虫功能代码
2017/06/24 Python
K-近邻算法的python实现代码分享
2017/12/09 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
2021/01/13 Python
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
使用phonegap克隆和删除联系人的实现方法
2017/03/31 HTML / CSS
TripAdvisor德国:全球领先的旅游网站
2017/12/07 全球购物
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
农田水利实习自我鉴定
2013/09/19 职场文书
元旦联欢会感言
2014/03/04 职场文书
民政局办理协议离婚(范本)
2014/10/25 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
2019教师的学习计划
2019/06/25 职场文书
python 调用js的四种方式
2021/04/11 Python
Python find()、rfind()方法及作用
2022/12/24 Python