如何阅读Oracle死锁图

1. 单实例死锁图

在单实例Oracle发生死锁时,在trc文件中会有死锁图,一般总是两个会话间的死锁,但是也会有其它情况。

1.1 死锁图阅读方法

下面描述一下死锁图的阅读方法:

Deadlock graph:
                      ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-00050018-000004fa        22     132     X             19     191           X
TX-00070008-00000461        19     191     X             22     132           X

session 132: DID 0001-0016-00000005     session 191: DID 0001-0013-0000000C
session 191: DID 0001-0013-0000000C     session 132: DID 0001-0016-00000005

相关字段解释

Resource Name : 被持有或等待的锁资源名字
                   锁资源名字由三部分组成 Type-ID1-ID2,ID1和ID2代表的意思由锁类型决定。
                   具体可以参考v$lock_type
process       :  V$PROCESS.PID
session       :  V$SESSION.SID
holds         :  锁持有的模式
waits         :  锁等待的模式

解读以上死锁图案例:

SID 132 (Process 22) 以排它模式持有锁:TX-00050018-000004fa,以排它模式请求锁:TX-00070008-00000461。
SID 191 (Process 19) 以排它模式持有锁:TX-00070008-00000461,以排它模式请求锁:TX-00050018-000004fa。

1.2 常见死锁图的问题类型


死锁图中关键信息是锁类型和请求的模式,常见的死锁图类型如下:

2. RAC死锁

2.1 说明

死锁在单实例上是以ORA-00060表现,并且在相关trc中以死锁图表现,但是在RAC上是以“Global Enqueue Services Deadlock”表现,如下:

Global Enqueue Services Deadlock detected. More info in file
/u01/diag/rdbms/rac/RAC1/trace/RAC1_ora_3457040.trc.

或者

Global Enqueue Services Deadlock detected. More info in file
/u01/diag/rdbms/rac/RAC1/trace/RAC1_lmd0_30429.trc.

单实例死锁一般只涉及到2个会话,但是在RAC环境下死锁就更复杂了,涉及的会话可能会超过2个会话。
当发现“Global Enqueue Service Deadlock”,表明发起死锁检查的会话已经回滚了本身的事务,以避免死锁的发生。

死锁的相关信息一般在lmd0或前台的trc文件。全局锁等待图样例如下:

Global Wait-For-Graph(WFG) at ddTS[0.138c] :
BLOCKED c000005aea610580 4 wq 2 cvtops x1 [0x18dff][0x0],[TM] [2006-006C-0026430A] 1
BLOCKER c000005ada7547c8 4 wq 2 cvtops x1 [0x18dff][0x0],[TM] [103B-03B3-00EA54A3] 0
BLOCKED c000005ada7547c8 4 wq 2 cvtops x1 [0x18dff][0x0],[TM] [103B-03B3-00EA54A3] 0
BLOCKER c000005aea610580 4 wq 2 cvtops x1 [0x18dff][0x0],[TM] [2006-006C-0026430A] 1

相关字段说明:

<BLOCKED|BLOCKER> <lockp> <cvt|held mode> <which q> <convert options> <res name - type id1.id2> [deadlock-level-trace] <node> 

这里TM锁的对象ID是:0x18dff,转成十进制是:101887
这个全局锁是由于TM锁造成,并且模式是4,这个问题的原因一般是子表的外键缺索引。

2.2 RAC死锁案例

2.2.1 排它模式TX死锁

Global Wait-For-Graph(WFG) at ddTS[0.170] :
BLOCKED 0x8aafb0ec 5 wq 2 cvtops x1 TX 0x320001.0x121c97 [99000-0001-00000002]0
BLOCKER 0x8aafafec 5 wq 1 cvtops x8 TX 0x320001.0x121c97 [9A000-0001-00000002]0
BLOCKED 0x8acb55e4 5 wq 2 cvtops x1 TX 0x430003.0x3843f [9A000-0001-00000002] 0
BLOCKER 0x8acb54e4 5 wq 1 cvtops x8 TX 0x430003.0x3843f [99000-0001-00000002] 0

字段说明:

<BLOCKED|BLOCKER> <lockp> <cvt|held mode> <which q> <convert options> <res name - type id1.id2> [deadlock-level-trace] <node>  

以上图形显示的死锁信息是在实例1(实例号从0开始)上的2个模式为5的TX锁。这两个会话涉及到的锁是:TX-0x320001-0x121c97,TX-0x430003-0x3843f
这种情况是典型的应用事务锁,通常是SQL的commit顺序和高并发导致。

2.2.2 共享模式TX死锁

Global Wait-For-Graph(WFG) at ddTS[0.b7] :
BLOCKED 0x2310e8918 3 [0x731000e][0x56268],[TX] [F1000-0001-0000000F] 0
BLOCKER 0x2310e87c8 3 [0x731000e][0x56268],[TX] [19F000-0001-00000011] 0
BLOCKED 0x2310e3c50 3 [0x72a0023][0x530d7],[TX] [19F000-0001-00000011] 0
BLOCKER 0x2310e7e80 3 [0x72a0023][0x530d7],[TX] [F1000-0001-0000000F] 0 

字段说明:

<BLOCKED|BLOCKER> <lockp> <cvt|held mode> <res name> <pid|did|txn_id> <node> 

共享模式的TX死锁,一般原因如下:

  • ITL争用,INITRANS设置太小,并发事务太高。
  • 如果相关的对象是唯一键索引,问题可能是唯一性校验引起。
  • 如果涉及问题的对象是位图索引,并发DML不应该使用位图索引。
  • 2.2.3 TM死锁

    Global Wait-For-Graph(WFG) at ddTS[0.1] :
    BLOCKED 0x7000003ccbf4798 3 wq 2 cvtops x1 TM 0x1cbde.0x0 [1004-004D-00000003] 0
    BLOCKER 0x7000003d0bf9ad8 3 wq 1 cvtops x1 TM 0x1cbde.0x0 [200A-00AC-00000019] 1
    BLOCKED 0x7000003d0bfcf88 2 wq 2 cvtops x1 TM 0x1cc77.0x0 [200A-00AC-00000019] 1
    BLOCKER 0x7000003cc338e88 2 wq 2 cvtops x1 TM 0x1cc77.0x0 [2006-0063-00000055] 1
    BLOCKED 0x7000003cc338e88 3 wq 2 cvtops x1 TM 0x1cc77.0x0 [2006-0063-00000055] 1
    BLOCKER 0x7000003c879f9c0 3 wq 1 cvtops x1 TM 0x1cc77.0x0 [2006-0063-00000020] 1
    BLOCKED 0x7000003c87978a8 2 wq 2 cvtops x1 TM 0x1cbde.0x0 [2006-0063-00000020] 1
    BLOCKER 0x7000003ccbf4798 2 wq 2 cvtops x1 TM 0x1cbde.0x0 [1004-004D-00000003] 0
    

    涉及的对象是:0x1cbde 和 0x1cc77,转成10进制后就是object_id。
    TM死锁引起的原因一般是外键缺索引

    2.2.4 TX、TM或IV的单资源死锁

    Granted global enqueue 0xd078cec0
    ...
    resname :[0x2001f][0x1a96c3],[TX]
    

    resname :[0x00001432][0x0],[TM]
    

    resname : [0xbb7cc5db][0x82d0d4b5],[IV]
    
  • TX enqueue上的单资源死锁,一般是由于自治事务导致。
  • 如果没有自治事务,可能是Bug 6145177

  • TM enqueue上的单资源死锁,一般是外键缺索引
  • IV(Instance Validation), 可能是Bug 8843816 可以忽略
  • 2.2.5 LB死锁

    Global Wait-For-Graph(WFG) at ddTS[0.390] :
    BLOCKED 0x3bc3e1b48 5 wq 2 cvtops x0 [0xd2703c03][0x545a14a5],[LB] [7B000-0002-00006C9D] 1
    BLOCKER 0x3bc2efad0 5 wq 1 cvtops x0 [0xd2703c03][0x545a14a5],[LB] [48000-0001-000069FE] 0
    BLOCKED 0x3bc2ed1c0 3 wq 2 cvtops x0 [0x415d0160][0xca28e8cf],[LB] [48000-0001-000069FE] 0
    BLOCKER 0x3bc2dc648 3 wq 2 cvtops x0 [0x415d0160][0xca28e8cf],[LB] [34000-0001-0000095E] 0
    BLOCKED 0x3bc2dc648 5 wq 2 cvtops x0 [0x415d0160][0xca28e8cf],[LB] [34000-0001-0000095E] 0
    BLOCKER 0x3bc2dbbb0 5 wq 1 cvtops x0 [0x415d0160][0xca28e8cf],[LB] [76000-0002-000074D4] 1
    BLOCKED 0x3bc2ef830 3 wq 2 cvtops x0 [0xd2703c03][0x545a14a5],[LB] [76000-0002-000074D4] 1
    BLOCKER 0x3bc3e1b48 3 wq 2 cvtops x0 [0xd2703c03][0x545a14a5],[LB] [7B000-0002-00006C9D] 1
    

    LB锁类型参照library cache lock。这种死锁类型一般是Bug.

    关于紫砂壶

    感悟技术人生
    此条目发表在Oracle基础知识分类目录,贴了标签。将固定链接加入收藏夹。