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 DGMGRL ORA-16603报错的解决方法(DG Broker)
Apr 06 Oracle
ORACLE查看当前账号的相关信息
Jun 18 Oracle
快速学习Oracle触发器和游标
Jun 30 Oracle
Oracle 临时表空间SQL语句的实现
Sep 25 Oracle
oracle删除超过N天数据脚本的方法
Feb 28 Oracle
Lakehouse数据湖并发控制陷阱分析
Mar 31 Oracle
解决Oracle数据库用户密码过期
May 11 Oracle
oracle数据库去除重复数据
May 20 Oracle
oracle delete误删除表数据后如何恢复
Jun 28 Oracle
oracle设置密码复杂度及设置超时退出的功能
Jun 28 Oracle
Oracle查看表空间使用率以及爆满解决方案详解
Jul 23 Oracle
RPM包方式安装Oracle21c的方法详解
oracle连接ODBC sqlserver数据源的详细步骤
Oracle以逗号分隔的字符串拆分为多行数据实例详解
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
ORACLE查看当前账号的相关信息
You might like
PHP中GET变量的使用
2006/10/09 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
PHP new static 和 new self详解
2017/02/19 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
2019/12/13 PHP
JS BASE64编码 window.atob(), window.btoa()
2021/03/09 Javascript
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
javascript Array.sort() 跨浏览器下需要考虑的问题
2009/12/07 Javascript
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
动态统计当前输入内容的字节、字符数的实例详解
2017/10/27 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
javascript实现简易的计算器
2020/01/17 Javascript
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
Django REST framework内置路由用法
2019/07/26 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
德国网上宠物店:Zoobio
2018/05/23 全球购物
美国运动鞋和服装网上商店:YCMC
2018/09/15 全球购物
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
会计专业自我评价
2014/02/12 职场文书
观看《永远的雷锋》心得体会
2014/03/12 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书