Skip to content

某行业务Oracle数据库卡顿简要分析

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

节点1:

节点2:

TOP SQL语句的分析

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

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

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

 等待事件对应的对象信息

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

对应的SQL语句是:INSERT INTO tran_jrnl VALUES(:id, :fiscal_date, :request_id, :respond_id, :tran_date, :tran_code, :channel_id, :teller_id, :branch_id, :resp_code, :resp_mesg, :status, :original_jrnl_id, :actual_teller_id, :service_name)

CBS.NEXF_APPROPRIATE表与 tran_jrnl 表存在主外键关联关系。

阻塞问题的进一步分析

 enq: TM – contention阻塞原理的分析

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

  • CBS用户的NEXF_APPROPRIATE表的REG_JRNL列,使用外键约束,对应的是tran_jrnl表的主键ID列。
  • 外键约束列上未创建索引。

DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION与TM等待的关系

OGG执行的操作,在数据库中对应的SQL是BEGIN DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(table_name => ‘”CBS”.”NEXF_APPROPRIATE”‘, 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 => ‘”CBS”.”NEXF_APPROPRIATE”‘, supplemental_logging => ‘none’); END; 的说明,此语句语句本身会引起TM锁;

总结

通过对数据库性能数据的分析,可以发现问题时段数据库出现严重的enq: TM – contention锁等待;结合ASH性能报告中可以对应找出出现异常等待事件的时对象为CBS.NEXF_APPROPRIATE表与 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 => ‘”CBS”.”NEXF_APPROPRIATE”‘, supplemental_logging => ‘none’); END; 的说明,此语句语句本身会引起TM锁;同时NEXF_APPROPRIATE表与 tran_jrnl 表存在主外键关联关系且外建列上无索引,tran_jrnl 表做为业务流水表会存在较多的INSERT操作,加剧了问题发生时的TM锁争用。