Oracle数据库常见等待事件原因和一般解决方法之(Enq: TM – contention)

本文主要是介绍Oracle数据库常见等待事件原因和一般解决方法之(Enq: TM – contention),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通常我们判断Oracle数据库的性能是否有问题,需要衡量一些指标值。其中很重要的一个要素就是等待事件。

我们通常可以通过AWR报告或者是DBA_HIST_SYSTEM_EVENT视图来找到这些等待事件。

Top 5 Timed Foreground Events

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                                                           Avg

                                                          wait   % DB

Event                                 Waits     Time(s)   (ms)   time Wait Class

------------------------------ ------------ ----------- ------ ------ ----------

DB CPU                                                3          64.6

control file sequential read          2,485           1      0   23.6 System I/O

SQL*Net break/reset to client           710           0      0    1.9 Applicatio

log file sync                             9           0      5    1.1 Commit

SQL*Net message to client             1,480           0      0     .3 Network

今天开始整理一下一些经常发生的等待事件的发生原因和一般性解决方法。


Enq: TM - contention

P1: Enqueue信息

P2: Object#

P3: 表或者分区表信息

- 发生的条件:

当DML(INSERT,UPDATE,DELETE,SELECT..FOR UPDATE,MERGE,LOCK TABLE等)语句执行的时候,需要获得对象表的TM锁,也就是表级锁。这是为了防止DML操作时需要访问的表被更改。

在获得TM锁的过程中发生的等待就是enq:TM – contention。

 

- 发生的原因:

一般情况下有如下几种可能。

1. 对于某些表执行DDL语句时执行了DML操作。反之则不会,DML执行的时候执行DDL会发生ORA-54.

2. 使用了Lock table语句。比如,当正在执行某些DML语句的时候,执行了Lock table,由于需要获得TM锁而发生等待。

3. 当DML语句执行的时候,对同一个对象表进行并行DML时会发生。原因是并行DML需要获取各种类型的锁。

  关于各种并行DML语句类型和需要获取锁的类型可以参考Oracle官方的文档。

  https://docs.oracle.com/en/database/oracle/oracle-database/19/vldbg/parameters-parallel-exec.html#GUID-C9A03D1A-66DA-4C73-813A-8AD5BC38952B

  Table 8-4 Locks Acquired by Parallel DML Statements

4. 外键约束上没有索引。

  在oracle早期版本的9i时代会出现这个问题,现在已经很少发生了。

5. INSERT / * + APPEND * / INTO 或者 SQL * Loader的direct path load。

   由于direct load不经过buffer cache直接读取数据文件,不允许表有任何变化,所以必须要获得排他的TM锁,获取的时候可能会发生enq:TM – contention。

 

- 问题发生时候的调查方法

问题发生的时候可以通过以下语句找到阻塞者的信息。

SELECT distinct w.tm, w.p2 OBJECT_ID, l.inst_id, l.sid, l.lmode, l.requestFROM ( SELECT p2, p3, 'TM-'||substr(p2raw,-8)||'-'||lpad(p3,8,'0') TMFROM v$session_wait WHERE event='enq: TM - contention'and state='WAITING') W, gv$lock LWHERE l.type(+)='TM'and l.id1(+)=w.p2and l.id2(+)=w.p3ORDER BY tm, lmode desc, request desc
;

注意有可能阻塞者并不只是一个。

如果发生时间点在过去,那么需要收集ASH报告,通过ASH报告的 EVENT 列来找到发生enq:TM – contention的信息,并根据BLOCKING_SESSION来特定阻塞者的session号。

 

- 解决方案

enq:TM-contention是一个和处理执行息息相关的等待事件。 只要根据上面的方法判断出发生enq:TM-contention'的session和阻塞者的session,

找到这些session 正在执行的sql语句,通过分时段执行就能避免该事件发生。比如一些能断定到需要长时间获得TM锁的处理,就放到空闲时间执行。

这篇关于Oracle数据库常见等待事件原因和一般解决方法之(Enq: TM – contention)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/159729

相关文章

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

SQL BETWEEN 的常见用法小结

《SQLBETWEEN的常见用法小结》BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQLBETWEEN的常见用法,感兴趣的朋友一起看看吧... 在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。它包含这两个边界值。BETWEEN操作符常用

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4: