您现在的位置是:首页 >其他 >enq: TM - contention等待事件引起的数据库卡顿分析网站首页其他

enq: TM - contention等待事件引起的数据库卡顿分析

Yushan Bai 2024-06-17 11:27:15
简介enq: TM - contention等待事件引起的数据库卡顿分析

用户的数据库系统在2022年5月31日下午17:25至17:45出现严重的锁等待,导致对应的应用程序出现卡顿等情况,业务系统的正常使用受到影响,无法正常办理业务;在此情况下需要排查出锁问题的深层原因,从而从根本上解决问题。

  • 问题分析
    1. 问题时间段的AWR性能数据分析

通过对数据库两个节点的DB TIME指标及后续的等待事件等分析,可以发现卡顿问题时主要为。本文档中的分析主要以数据库节点1的数据为基准。

      1. 数据库等待事件数据

问题时间点,数据库主要为enq: TM - contention等待事件;

节点1:

 

节点2:

 

      1. TOP SQL语句的分析

数据库有一条SQL执行时间长,经沟通确认为OGG中添加表附加日志的操作产生的:BEGIN DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(table_name => '"AA"."BB"', supplemental_logging => 'none'); END;

 

    1. ASH报告中异常发生的时间段

从ASH性能报告中,可以看到enq: TM - contention等待事件发生在17:20-17:45分左右:

 

    1. 等待事件对应的对象信息

查看ASH报告,可以发现异常的TM等待对应的表是:CBS.NEXF_APPROPRIATE

对应的SQL语句是:INSERT INTO AAAAA VALUES(:id, :fiscal_date, :request_id, :respond_id, :tran_date, :tran_code, :channel_id, :teller_id)

AA.BBB表与 tran_AAA表存在主外键关联关系。

    1. 阻塞问题的进一步分析
      1. enq: TM - contention阻塞原理的分析

通过前面分析,可以发现从ASH报告中找出的TOP SQL对象之间存在主外键约束关系,具体为:

  • AA用户的NEXF_APP表的REGL列,使用外键约束,对应的是tran表的主键ID列。
  • 外键约束列上未创建索引。

      1. DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION与TM等待的关系

OGG执行的操作,在数据库中对应的SQL是BEGIN DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(table_name => '"AA"."BBBB"', supplemental_logging => 'none'); END;

ORACLE官方文档中(High 'enq: TM - contention' Wait Event Causing Session Hangs in an Oracle Streams Environment (Doc ID 740728.1)),对于OGG附加日志时执行的语句:BEGIN DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(table_name => '"AAA"."NBBB"', supplemental_logging => 'none'); END; 的说明,此语句语句本身会引起TM锁;

  • 总结与后续处理建议
    1. 问题分析总结

通过对数据库性能数据的分析,可以发现问题时段数据库出现严重的enq: TM - contention锁等待;结合ASH性能报告中可以对应找出出现异常等待事件的时对象为AA.BBIATE表与 tran_jrnl 表,这两张表存在主外键关联关系;

因此结合ORACLE官方文档中(High 'enq: TM - contention' Wait Event Causing Session Hangs in an Oracle Streams Environment (Doc ID 740728.1)),对于OGG附加日志时执行的语句:BEGIN DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(table_name => '"AA"."BB"', supplemental_logging => 'none'); END; 的说明,此语句语句本身会引起TM锁;同时NEXF表与 tran表存在主外键关联关系且外建列上无索引,tran表做为业务流水表会存在较多的INSERT操作,加剧了问题发生时的TM锁争用。

    1. 后续优化建议
  1. 对AA.NEXF表上的两个有外建约束的列创建索引,避免后续此类问题的发生。创建索引时需要注意查看表空间使用情况、使用ONLINE在线模式创建索引及关注归档日志产生量是否过大等。

对表添加附加日志等涉及数据库的操作时,建议在业务较少时、数据库系统空闲时进行,尽可能减少和规避对业务使用

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。