ORACLE 死锁分析过程

ORACLE 死锁分析
关于死锁一般3种处理方式
1、事前预测
2、资源分级
3、事后检测释放

我知道的ORACLE MYSQL都是采用第三种在行锁级别上的话。
这里分析一个ORACLE死锁,首先一个死锁肯定会生成一个TRACE文件,这里会记录很多信息如:
Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-0058000f-0000b473       649    1204     X            651    1252           X
TX-0019001c-0004e0b0       651    1252     X            649    1204           X

这里给出了进程和会话id
Rows waited on:
  Session 1204: obj - rowid = 0003D942 - AAA9lCAAEAADgaNAAI
  (dictionary objn - 252226, file - 4, block - 919181, slot - 8)
  Session 1252: obj - rowid = 0003D942 - AAA9lCAAEAADgaNAAa
  (dictionary objn - 252226, file - 4, block - 919181, slot - 26)
这里给出导致死锁的行

同时给出了最后触发死锁会话 1252的语句
----- Information for the OTHER waiting sessions -----
Session 1252:
  sid: 1252 ser: 35883 audsid: 7170593 user: 235/FEECORESV
    flags: (0x100045) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
    flags2: (0x40009) -/-/INC
  pid: 651 O/S info: user: oracle, term: UNKNOWN, ospid: 13035
    image: oracle@oratest11
  client details:
    O/S info: user: sky, term: unknown, ospid: 1234
    machine: autobots program: JDBC Thin Client
    application name: JDBC Thin Client, hash value=2546894660
  current SQL:
  UPDATE *******
 
----- End of information for the OTHER waiting sessions -----
 
Information for THIS session:
 
----- Current SQL Statement for this session (sql_id=3vh5sc7pgtrjy) -----
UPDATE *******

那么到这里我们大概能够分析出
A:1204拿到AAA9lCAAEAADgaNAAa 行锁    B:1252 拿到 AAA9lCAAEAADgaNAAI 行锁
C:1204需要AAA9lCAAEAADgaNAAI 则等待   D:1252 需要  AAA9lCAAEAADgaNAAa 则触发死锁1204回滚

那么随后trace给出1204 C这一步等待时间和事物信息
SO: 0xee1fcd10, type: 4, owner: 0xf031e750, flag: INIT/-/-/0x00 if: 0x3 c: 0x3
     proc=0xf031e750, name=session, file=ksu.h LINE:12624, pg=0
    (session) sid: 1204 ser: 2443 trans: 0xe9221180, creator: 0xf031e750
              flags: (0x100045) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
              flags2: (0x40009) -/-/INC
              DID: , short-term DID: 
              txn branch: (nil)
              oct: 6, prv: 0, sql: 0xf25d2278, psql: 0xc4346788, user: 235/FEECORESV
    ksuxds FALSE at location: 0
    service name: SYS$USERS
Current Wait Stack:
     0: waiting for 'enq: TX - row lock contention'
        name|mode=0x54580006, usn<<16 | slot=0x19001c, sequence=0x4e0b0
        wait_id=33 seq_num=34 snap_id=1
        wait times: snap=3.001739 sec, exc=3.001739 sec, total=3.001739 sec
        wait times: max=infinite, heur=3.001739 sec
        wait counts: calls=1 os=1
        in_wait=1 iflags=0x15a0
随后给出了导致他等待会话的等待信息,这里不给出。当然随后还有很多类容,但是关键就是如上
但是这里并没有一个显示的事物执行的过程,如果要看到完整的语句我们需要日志挖掘,我挖掘出来的如下:

1204:
set transaction read write;
select * from TEST.TEST where ROWID = 'AAA9lCAAEAADgaNAAa' for update;
commit;
1252:
set transaction read write;
select * from TEST.TEST where ROWID = 'AAA9lCAAEAADgaNAAI' for update;
update TEST.TEST set "STATUS" = 'SUCCESS', "DETAIL" = '执行成功', "RAW_UPDATE_TIME" = TO_TIMESTAMP('19-SEP-16 01.27.25.714715 PM') where "IDENTITY" = '39319' and "STATUS" = 'PROCESSING' and "DETAIL" IS NULL and "RAW_UPDATE_TIME" = TO_TIMESTAMP('19-SEP-16 01.27.24.611036 PM') and ROWID = 'AAA9lCAAEAADgaNAAa';
commit;

这样能够清楚的看到1204的update并没有执行,而由于触发了deadlock回滚掉了。

时间: 2024-09-19 17:17:40

ORACLE 死锁分析过程的相关文章

Oracle 死锁分析过程详解

Oracle 死锁分析 关于死锁一般3种处理方式 1.事前预测 2.资源分级 3.事后检测释放 我知道的ORACLE MYSQL都是采用第三种在行锁级别上的话. 这里分析一个ORACLE死锁,首先一个死锁肯定会生成一个TRACE文件,这里会记录很多信息如: Deadlock graph: ---------Blocker(s)--------  ---------Waiter(s)--------- Resource Name          process session holds wai

记一次ORACLE的UNDO表空间爆满分析过程

  这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作业是15分钟一次),从告警邮件分析,好像是UNDO表空间突然一下子被耗尽了.   DB Tablespace Allocated Free Used % Free % Used 192.168.xxx.xxx:1521 UNDOTBS1 16384 190.25 16193.75 1.16 99

【锁】Oracle死锁(DeadLock)的分类及其模拟

[锁]Oracle死锁(DeadLock)的分类及其模拟 1  BLOG文档结构图   2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 死锁的概念及其trace文件 ② 死锁的分类 ③ 行级死锁的模拟 ④ ITL的概念.ITL结构 ⑤ ITL引发的死锁处理 ⑥ ITL死锁的模拟 Tips: ① 本文在itpub(http://blog.itpub.net/26736162).博客园(http

如何杀死oracle死锁进程

方法一:Oracle的死锁非常令人头疼,总结了一些点滴经验作为学习笔记 1.查哪个过程被锁查V$DB_OBJECT_CACHE视图: SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND LOCKS!='0'; 2. 查是哪一个SID,通过SID可知道是哪个SESSION.查V$ACCESS视图: SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名'; 3.

关闭Oracle死锁进程的具体步骤

有效关闭Oracle死锁进程的具体步骤: 1.查哪个过程被锁 查V$DB_OBJECT_CACHE视图: SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND CLOCKS!='0'; 2. 查是哪一个SID,通过SID可知道是哪个SESSION 查V$ACCESS视图: SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名'; 3. 查出SID和SERIAL#

MySQL · 答疑解惑 · 物理备份死锁分析

背景 本文对 5.6 主备场景下,在备库做物理备份遇到死锁的case进行分析,希望对大家有所帮助. 这里用的的物理备份工具是 Percona-XtraBackup(PXB),有的同学可能不清楚其备份流程,所以这里先简单说下,PXB的备份步骤是这样的: 拷贝 InnoDB redo log,这是一个单独的线程在拷,直到备份结束: 拷贝所有InnoDB ibd文件: 加全局读锁,执行 FLUSH TABLES WITH READ LOCK(FTWRL); 拷贝 frm.MYD.MYI 等文件: 获取

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_addres

Oracle死锁问题查询及处理方法介绍

一.数据库死锁的现象  首先确认登录的界面  sys/dba   就是程序没有返回了,像软件卡死一样的  二.死锁的原理  就是一个操作完成了未执行完成提交了导致后面的队列中的数据一直等待从而导致了死锁了.  三.死锁的定位方法  通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台.   1)用dba用户执行以下语句   select username,lockwait,status,machine,program from v$session where sid in  

理解和使用Oracle 8i分析工具LogMiner_oracle

正在看的ORACLE教程是:理解和使用Oracle 8i分析工具LogMiner.Oracle LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重作日志文件(归档日志文件)中的具体内容,特别是,该工具可以分析出所有对于数据库操作的DML(insert.update.delete等)语句,另外还可分析得到一些必要的回滚SQL语句.该工具特别适用于调试.审计或者回退某个特定的事务. LogMiner分析工具实际上是由一组PL/S