问题时间点,数据库主要为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锁争用。
某行业务Oracle数据库卡顿简要分析