DBA急救手册:拆解Oracle死锁图,ORA-00060错误秒级定位终极指南

发布于:2025-08-08 ⋅ 阅读:(21) ⋅ 点赞:(0)

关于“死锁图”(Deadlock Graph)的一点浅见

当 Oracle 检测到死锁时,检测到死锁的会话中的当前 SQL 将被取消,并执行“语句级回滚”,以释放资源并避免阻塞所有活动。

检测到死锁的会话仍然“存活”,并且事务的其余部分仍然处于活动状态。如果您在该会话中重复上次(被取消的)操作,那么您将再次遇到死锁。

当检测到此类死锁时,会生成一个trace文件,其中包含“死锁图”(以及其他有用信息)。

通过对大量服务请求的审查,我们发现最常见的死锁类型可以通过一个“特征”死锁图来识别,该图可用于确定所遇到的死锁的“类型”。
本文将展示每种类型的示例,以便调查和解决工作能够沿着正确的方向进行。

这篇文章将说明如何利用由 ORA-00060 错误生成的“死锁图”(Deadlock Graph)来识别根本问题。
一个典型的死锁图可能看起来像这样:


为了区分不同的类型,我们采用了锁类型以及持有者和等待者所持有的/等待的模式,并以此为每个类型创建了一个签名。
例如,前面的图表显示了以下特征:

  1. 死锁图中多于 1 行
  1. 所有锁类型均为排他锁(TX)
  2. 持有者和等待者的锁模式均为 X(独占模式,模式 6)

通过关注图表中的这些特定特征:


将给我们以下类型(这通常是应用程序死锁):

TX X X Tx x x
TX X X Tx x x

请注意,对于死锁类型识别而言,“关键签名”中最重要的部分是锁类型以及它所请求的模式。主要类型在下表中已突出显示。
最常见的类型有:

Oracle 锁模式有

0 - none 0—无
1 - null (NULL) 1 - null (null)
2 - 行共享,也称为子共享表锁(SS)
3 - 行排他表锁,也称为子排他表锁(SX)
4 - 共享表锁(S)
5 - 共享行排他锁,也称为共享子排他表锁(SSX)
6 -排他(X)

注意:通常我们会看到应用程序死锁的“特征”与其他特征之一的组合,而不是“典型”的重复特征。例如,您可能会看到类似这样的内容:

死锁图
                     ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name                    process session holds waits  process session holds waits
TM-XXXXXXXX-00000000       11      333     SX                      22        44          SX     SSX
TX-XXXXXXXX-XXXXXXXX       22      44      X                        11        333                    X

这是“应用程序死锁”和“外键(FK)约束缺失索引”死锁的组合。在这种情况下,建议先解决非“TX X X”的症状,因为不太常见的 FK/ITL/位图签名更有可能是根本原因,而不是应用程序死锁。

请注意,trace 文件包含各种相关信息,这些信息可能与问题有关,也可能无关,这取决于死锁的类型。

例如,在“Rows Waited on”部分,“dictionary objn”值在某些情况下可用于识别相关对象,但在其他情况下可能指向完全不相关的信息。
如果信息可用,会在相关部分注明,否则请勿依赖。

关于锁定模式和锁定的更多内容请见下文:

Oracle® Database Concepts
12c Release 1 (12.1) 
E17633-20
Chapter 9 Data Concurrency and Consistency
https://docs.oracle.com/database/121/CNCPT/consist.htm#CNCPT020

参考文档

Document 1552194.1 ORA-00060 Deadlock Graph Not Matching any Examples: Suggested Next Steps
Document 60.1 Troubleshooting Assistant: Oracle Database ORA-00060 Errors on Single Instance (Non-RAC) Diagnosing Using Deadlock Graphs in ORA-00060 Trace Files
How to Identify ORA-00060 Deadlock Types Using Deadlock Graphs in Trace (Doc ID 1507093.1)
Document 1559695.1 How to Diagnose Different ORA-00060 Deadlock Types Using Deadlock Graphs in Trace 

网站公告

今日签到

点亮在社区的每一天
去签到