用户的数据库系统在2022年5月31日下午17:25至17:45出现严重的锁等待,导致对应的应用程序出现卡顿等情况,业务系统的正常使用受到影响,无法正常办理业务;在此情况下需要排查出锁问题的深层原因,从而从根本上解决问题。
- 问题分析
- 问题时间段的AWR性能数据分析
通过对数据库两个节点的DB TIME指标及后续的等待事件等分析,可以发现卡顿问题时主要为。本文档中的分析主要以数据库节点1的数据为基准。
-
-
- 数据库等待事件数据
-
问题时间点,数据库主要为enq: TM - contention等待事件;
节点1:
节点2:
-
-
- TOP SQL语句的分析
-
数据库有一条SQL执行时间长,经沟通确认为OGG中添加表附加日志的操作产生的:BEGIN DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(table_name => '"AA"."BB"', supplemental_logging => 'none'); END;
-
- ASH报告中异常发生的时间段
从ASH性能报告中,可以看到enq: TM - contention等待事件发生在17:20-17:45分左右:
-
- 等待事件对应的对象信息
查看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表存在主外键关联关系。
-
- 阻塞问题的进一步分析
- enq: TM - contention阻塞原理的分析
- 阻塞问题的进一步分析
通过前面分析,可以发现从ASH报告中找出的TOP SQL对象之间存在主外键约束关系,具体为:
- AA用户的NEXF_APP表的REGL列,使用外键约束,对应的是tran表的主键ID列。
- 外键约束列上未创建索引。
-
-
- 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锁;
- 总结与后续处理建议
- 问题分析总结
通过对数据库性能数据的分析,可以发现问题时段数据库出现严重的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锁争用。
-
- 后续优化建议
- 对AA.NEXF表上的两个有外建约束的列创建索引,避免后续此类问题的发生。创建索引时需要注意查看表空间使用情况、使用ONLINE在线模式创建索引及关注归档日志产生量是否过大等。
对表添加附加日志等涉及数据库的操作时,建议在业务较少时、数据库系统空闲时进行,尽可能减少和规避对业务使用