背景

客户环境使用EMCC13.5 监控EXADATA数据库 并结合钉钉将数据库告警实时打印到钉钉DB群

前段时间突然收到一个很离谱的告警

Alert
HostName= xxxxx
TargetType= Cluster Database
TargetName= xxxxx
Message= 6,470,713 seconds in DB Time is spent waiting for TX lock.
EventTime= Mar 16, 2024 9:00:03 AM CST @所有人

6,470,713 seconds的TX锁?什么情况?两个月的TX锁?客户TB级别的数据库,出现这么久的TX锁难道没有一点影响? 怀着疑惑连上了数据库去查此时后台的等待事件并没有发现任何锁,捞取了相关时间段的awr,ash等都没有看到TX类型的锁等待。此时判断是误报,

Alert
HostName= xxxx
TargetType= Cluster Database
TargetName= xxxx
Message= 736,546 seconds in DB Time is spent waiting for TM lock.
EventTime= Mar 17, 2024 12:41:20 PM CST @所有人

一天后另一个DB又收到了一条类似的问题,但这次是TM 锁,持续时间一周左右。 登上DB查询后发现和之前的情况一样。此时已经可以确认两次都是误报,那这个误报是怎么产生的?

问题调查

年初客户的EXADATA环境进行了image的升级,升级后当前image版本为22.1.18.0.0,需要将之前使用的EMCC13.4升级到13.5才能完美监控EXADATA,这个动作也是近期完成的。难道是因为升级了EMCC导致的误报?

带着这个疑惑向oracle提了一个case去咨询这个问题,oracle要求提供告警信息截图

EMCC13.5 TX/TM锁误报_数据库

但是问题来了,按照这个指示我们一层层登入EMCC发现意外事件管理器并没有任何关于TX/TM锁的记录。于是将这个调查结果又回复给了case,并且这时候很巧又报了一次TX,lock,我顺便将这次告警的信息也一起上传给oracle

EMCC13.5 TX/TM锁误报_EMCC_02

这次case提供了一条metric  去查询TX/TM锁

WITH Lock_types as
(select 'TX' as lock_type from dual
UNION
select 'TM' from dual
UNION
select 'UL' from dual)
,blocked_locks as
(select p2 id1,
p3 id2,
case when event like 'enq: TX%' then 'TX'
when event = 'enq: UL - contention' then 'UL'
when event = 'enq: TM - contention' then 'TM'
end lock_type,
count(*) num_blocked,
sum(last_call_et) dbtime_blocked
from gv$session
where (event like 'enq: TX%'
or event in ('enq: UL - contention','enq: TM - contention'))
and wait_time=0
group by p2,p3,
case when event like 'enq: TX%' then 'TX'
when event = 'enq: UL - contention' then 'UL'
when event = 'enq: TM - contention' then 'TM'
end)
SELECT
LT.lock_type
,NVL(MAX(BL.num_blocked),0) as max_blocked
,NVL(MAX(BL.dbtime_blocked),0) as max_dbtime_blocked
FROM
blocked_locks BL
,lock_types LT
WHERE
LT.lock_type = BL.lock_type(+)
GROUP BY
LT.lock_type;

查询结果如下

EMCC13.5 TX/TM锁误报_数据库_03

调查结果

此时再将所有的信息提供给case,两小时左右,终于迎来了oracle的回复

EMCC13.5 TX/TM锁误报_EMCC_04

根据回复来看EMCC13.5的收集确实存在着问题,我们根据oracle的意见先去agent查看这个文件

[oracle@xxxx ~]$
[oracle@xxxx ~]$
[oracle@xxxx ~]$ cd /EMCC/agent_13.5.0.0.0/plugins/oracle.sysman.db.agent.plugin_13.5.1.0.0/metadata
[oracle@xxxx metadata]$ ls
adr_info.xmlp                      gds_creds.xmlp                      inst_farsync_common.xmlp                oracle_dbservice.xml
asmcreds.xmlp                      gds_gsm_common.xmlp                 inst_logfiles.xmlp                      oracle_dbsvc.xml
cloud_db_common_metrics.xmlp       gds_gsm.xml                         inst_misc.xmlp                          oracle_dbsys.xml
cloud_db_creds.xmlp                gds_pool_common.xmlp                inst_ondemand.xmlp                      oracle_farsync.xml
cloud_db_inst_props.xmlp           gds_pool.xml                        inst_perf.xmlp                          oracle_listener.xml
cloud_schema_storage_metrics.xmlp  gds_shard_director.xml              inst_properties.xmlp                    oracle_pdbexpress.xml
cluster.xml                        gds_sharded_database.xml            oci_creds.xmlp                          oracle_pdb.xml
creds.xmlp                         gds_shardgroup.xml                  oldVersions                             order.xml
database.xmlp                      gds_shardspace.xml                  oracle_cloud_adw.xml                    osb_server.xml
db_farsync_common_dyn_props.xmlp   hascluster.xmlp                     oracle_cloud_atp.xml                    osm_cluster.xml
db_farsync_common.xmlp             has.xml                             oracle_cloud_dbcs.xml                   osm_common.xmlp
dyn_props.xmlp                     inst_adaptive.xmlp                  oracle_cloud_db_ha_backup_metrics.xmlp  osm_instance.xml
emdb_ccc_oracle_metrics.xmlp       instance.xmlp                       oracle_cloud_db_service.xml             osm_ioserver.xml
esa_database_dyn_props.xmlp        inst_checkers.xmlp                  oracle_cloud_infrastructure.xml         osm_proxy.xml
esa_instance_dyn_props.xmlp        inst_config.xmlp                    oracle_cloud_tenant.xml                 rac_database.xml
gds_cloud.xml                      inst_dynamic_props.xmlp             oracle_cman.xml                         scn_info.xmlp
gds_common.xmlp                    inst_farsync_common_dyn_props.xmlp  oracle_database.xml                     target_version.xmlp
[oracle@hzsmtx6dbadm01 metadata]$ vi database.xmlp

编辑database.xmlp 找到last_call_et

EMCC13.5 TX/TM锁误报_EMCC_05

解决方法

已经明确了问题接下来我们按照oracle的建议进行更改

[oracle@xxxx ~]$ cd /EMCC/agent_13.5.0.0.0/plugins/oracle.sysman.db.agent.plugin_13.5.1.0.0/metadata
[oracle@xxxx metadata]$ cp database.xmlp database_bak.xmlp
[oracle@xxxx metadata]$ vi database.xmlp

替换last_call_et 为seconds_in_wait

重启agent
[oracle@xxxx ~]$ cd /EMCC/agent_13.5.0.0.0/bin
[oracle@xxxx bin]$ ./emctl stop agent
Oracle Enterprise Manager Cloud Control 13c Release 5
Copyright (c) 1996, 2021 Oracle Corporation.  All rights reserved.
Stopping agent ... stopped.
[oracle@xxxx bin]$ ./emctl start agent
Oracle Enterprise Manager Cloud Control 13c Release 5
Copyright (c) 1996, 2021 Oracle Corporation.  All rights reserved.
Starting agent ....................................... started.
RAC每个节点 都需要替换和重启

修改完成后观察2个月已不在产生误报