我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Oracle 死锁的检测查询及处理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Oracle 死锁的检测查询及处理

死锁查询语句:


-- 死锁查询语句
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',          
              1, 'Blocking',              
              2, 'Global',           
              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 死锁的检测查询及处理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Oracle 死锁的检测查询及处理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

oracle死锁查询和处理的方法是什么

Oracle数据库提供了多种方法来查询和处理死锁。以下是一些常用的方法:查询死锁:可以使用以下SQL语句查询当前是否存在死锁:SELECT DISTINCT l1.sid || ',' || l1.serial# || ',' || l1.
oracle死锁查询和处理的方法是什么
2024-04-09

数据库死锁排查及处理方法

1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程(如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程) show processlist 3.杀死进程id(就是上面命令的id列) kil
数据库死锁排查及处理方法
2015-10-31

数据库死锁:避免、检测和处理数据库中的“争吵”

数据库死锁是数据库中两个或多个事务同时等待彼此释放资源的情况,这会导致数据库操作无法正常进行。避免、检测和处理数据库死锁对于保持数据库的正常运作至关重要。
数据库死锁:避免、检测和处理数据库中的“争吵”
2024-02-05

Oracle中表被锁的原因及处理方法

Oracle中表被锁的原因及处理方法在Oracle数据库中,表被锁是一种常见的现象,而造成表被锁的原因也有很多种。本文将探讨一些常见的表被锁的原因,并提供一些处理方法以及相关的代码示例。1. 锁的类型在Oracle数据库中,锁主要分为
Oracle中表被锁的原因及处理方法
2024-03-03

测试取消分页查询时处理不精确的计时

在进行数据库查询时,我们经常会遇到分页查询的情况。然而,当取消分页查询时,有时会导致计时不准确的问题。这个问题对于需要精确计时的应用程序来说是非常关键的。在本文中,php小编百草将为您介绍如何处理这个问题,从而确保计时的准确性和精确性。我们
测试取消分页查询时处理不精确的计时
2024-02-14

Oracle中如何处理大量数据的查询优化

在Oracle中处理大量数据的查询优化可以通过以下几种方法来实现:创建索引:在数据库表中创建索引可以加快数据查询的速度。可以根据查询的需求来创建合适的索引,如在经常用于查询的列上创建索引,或者使用复合索引来提高查询效率。使用合适的查询语句:
Oracle中如何处理大量数据的查询优化
2024-04-09

索引在Oracle中处理复杂子查询的策略

在处理复杂子查询时,索引在Oracle中起着至关重要的作用。以下是一些处理复杂子查询时索引的策略:确保子查询中的所有列都有适当的索引:在进行复杂子查询时,确保子查询中涉及的所有列都有适当的索引。如果没有适当的索引,Oracle将不得不进行全
索引在Oracle中处理复杂子查询的策略
2024-08-15

索引在Oracle处理复杂查询中的优化思路

在Oracle中,针对复杂查询的优化思路主要包括以下几个方面:创建合适的索引:在进行复杂查询时,首先需要考虑是否已经为查询涉及的列创建了合适的索引。索引可以加快查询的速度,特别是在涉及到大量数据的情况下。需要注意的是,索引的创建应该基于查询
索引在Oracle处理复杂查询中的优化思路
2024-08-15

索引在Oracle中处理跨多个表查询的优化

在Oracle中,处理跨多个表查询的优化可以通过创建合适的索引来提高查询性能。以下是一些优化跨多个表查询的方法:创建联合索引:如果查询涉及多个表的多个列,可以考虑创建联合索引来覆盖所有查询条件。这样可以减少查询时需要访问的数据块数量,从而提
索引在Oracle中处理跨多个表查询的优化
2024-08-15

SQLServer 错误 5231 对象 ID O_ID (对象“NAME”):尝试锁定此对象以进行检查时出现死锁。 已跳过此对象,不会处理它。 故障 处理 修复 支持远程

详细信息 Attribute 值 产品名称 SQL Server 事件 ID 5231 事件源 MSSQLSERVER 组件 SQLEngine 符号名称 DBCC4_DEADLOCK_SKIPPED_OBJECT ...
SQLServer 错误 5231 对象 ID O_ID (对象“NAME”):尝试锁定此对象以进行检查时出现死锁。 已跳过此对象,不会处理它。 故障 处理 修复 支持远程
2023-11-05
SQLServer 错误 7988 系统表预检查:对象 ID O_ID。 在 P_ID 处检测到数据链中存在循环。 由于不可修复的错误,Check 语句已终止。 故障 处理 修复 支持远程
2023-11-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录