当前位置: 首页 > news >正文

Oracle AWR案例分析: 诊断‘enq: TX - row lock contention‘等待事件

全网最全面的Oracle AWR 专栏,持续更新中…

在一个繁忙且健康的数据库环境中,多会话同时修改相同数据行是不可避免的。当这种情况发生时,一个会话必须等待另一个完成提交,这就引发了 “enq: TX - row lock contention” 等待事件。

在高并发的数据库中,适度的行锁竞争是正常现象,但若竞争过度,则会严重影响系统的可扩展性。本节将通过一个实际案例来说明如何诊断这种等待事件。

AWR 报告中的症状

在这里插入图片描述

从"Top 10 Foreground Events by Total Wait Time" 中,我们看到:

  • “enq: TX - row lock contention” 事件发生了 20次.
  • 这个世界平均等待时间超过了 4 秒。
  • 它占总 DB Time的 21.6%。

接着,在 “Segment Statistics” 下的 “Segments by Row Lock Waits” 子部分中,我们可以找到引发竞争的对象。

在这里插入图片描述

从结果可以确认,所有 20 次竞争都发生在表 “WAREHOUSES” 上。
在这里插入图片描述
在 “SQL Statistics” 部分,我们发现了一条可疑的 SQL 语句。通常情况下,一条 SQL 的 %CPU 与 %IO 总和应接近 100%,但这条 SQL 的两者之和仅为 2.15%。这表明其大部分时间并未用于 CPU 或 I/O,而是等待其他事件。

一个合理的推断是,该 SQL 的时间主要消耗在 “enq: TX - row lock contention” 等待上,理由如下:

  • 在 Top Event 列表中,除了CPU和IO外的一较长时间等待事件是 “enq: TX - row lock contention”。
  • 该 SQL 的总执行时间为 90.74 秒,与该等待事件的 88.4 秒很接近。
  • SQL 文本以 “UPDATE WAREHOUSES SET WAREHOUS…” 开头,与前文中锁竞争的对象 “WAREHOUSES” 相匹配。

当然,也可以使用$ORACLE_HOME/rdbms/admin/awrsqrpt.sql 生成针对该 SQL 的单独 AWR 报告以进一步分析,但此处我们跳过这一步。

使用ASH精确定位被锁数据行

到目前为止,我们已确定了触发 “enq: TX - row lock contention” 的 SQL 语句和对象。通常,解决行锁竞争的任务属于开发人员的职责,他们需要通过修改应用逻辑或 SQL 语句来避免竞争。但 DBA 可以进一步协助开发人员,帮助他们精确定位被锁定的具体行。这能快速判断是哪一业务逻辑部分导致了问题。

当 ASH 捕获到 “enq: TX - row lock contention” 等待时,它会记录以下四个字段:CURRENT_OBJ#CURRENT_FILE#CURRENT_BLOCK#CURRENT_ROW#。通过这些字段,我们可以生成被锁记录的 rowid,从而定位具体的行。 以下 SQL 用于实现这一逻辑:

SELECT ob.owner, ob.object_name,dbms_rowid.rowid_create(rowid_type => 1,object_number => ob.data_object_id,relative_fno => sh.current_file#,block_number => sh.current_block#,row_number => sh.current_row#) AS row_id,COUNT(*) AS occurrence_countFROM dba_hist_active_sess_history shJOIN dba_objects ob ON sh.current_obj# = ob.object_idWHERE sh.snap_id = 2226AND sh.event = 'enq: TX - row lock contention'GROUP BY ob.owner, ob.object_name, dbms_rowid.rowid_create(rowid_type => 1,object_number => ob.data_object_id,relative_fno => sh.current_file#,block_number => sh.current_block#,row_number => sh.current_row#)ORDER BY occurrence_count DESC;

输出结果如下:

OWNER   OBJECT_NAME   ROW_ID                 OCCURRENCE_COUNT
YUAN    WAREHOUSES    AAAR2FAAFAAJibBABo                    5
YUAN    WAREHOUSES    AAAR2FAAFAAJibBAC6                    2
YUAN    WAREHOUSES    AAAR2FAAFAAJibBACM                    2
YUAN    WAREHOUSES    AAAR2FAAFAAJibBABU                    1
YUAN    WAREHOUSES    AAAR2FAAFAAJibBACU                    1
YUAN    WAREHOUSES    AAAR2FAAFAAJibBAAV                    16 rows selected.

从输出的结果可以看出,出现次数最多的记录是 5 次,它的ROWID是’AAAR2FAAFAAJibBABo’。 我们可以根据其 rowid 查看对应的行内容:

SQL> select * from yuan.warehouses where rowid='AAAR2FAAFAAJibBABo';

这样,我们就能精确定位到被锁的具体行。

这就是使用 AWR 与 ASH 相互配合,由宏观到微观的进行数据库故障诊断典型例子。

号主在certview.oracle.com网站上的证书清单截图。
在这里插入图片描述

关于号主,姚远:

  • Oracle ACE(Oracle和MySQL数据库方向)
  • 华为云最有价值专家
  • 《MySQL 8.0运维与优化》的作者
  • 拥有数十项数据库认证
  • 曾任IBM公司数据库部门经理
  • 20+年DBA经验,服务2万+客户
  • 精通C和Java,发明两项计算机专利
  • 两次获得国家部级奖
http://www.dtcms.com/a/573743.html

相关文章:

  • 【云运维】Zabbix 6.0 基于 LNMP 架构部署指南
  • 企业做网站要注意些什么问题大宗交易平台查询
  • 网站安全的必要性做电影网站违法吗
  • EtherCAT、PROFINET、EtherNet/IP和Modbus TCP主要区别
  • 电脑误格式化误删除如何通过数据恢复软件免费版搭建数据恢复中心
  • 如何平衡 ToB 产品中不同客户的需求
  • 基础数据结构之数组的前缀和技巧:和为K的子数组(LeetCode 560 中等题)
  • 【基础排序】CF - 最优排列Permutator
  • [RE2] Prog对象(字节码) | Inst指令序列 | 字节映射和指令扁平化
  • 灰系网站网站运营设计
  • C++ STL::vector底层剖析
  • 多线程环境下,线程安全单例模式的方案避坑
  • 深度学习-卷积神经网络LeNet
  • Ubuntu误删libaudit.so.1 导致系统无法正常使用、崩溃
  • 【深度学习5】多层感知机
  • 通过fluent HEC 来发送数据到splunk
  • 二叉树深度解析:核心概念与算法实现
  • 考研408--操作系统--day3--调度调度算法
  • 东莞做网站首选企业铭wordpress 4.5.4 漏洞
  • 消防做ccc去那个网站微信网页版客户端下载
  • 项目实战 | 新建校区网络安全项目:从搭建到交付
  • MHAF-YOLO:用于精确目标检测的多分支异构辅助融合YOLO
  • 从零到上线:Spring Boot 3 + Spring Cloud Alibaba + Vue 3 构建高可用 RBAC 微服务系统(超详细实战)
  • 优秀企业网站模板下载企业网络推广方案怎么做
  • Spring国际化语言切换不生效
  • 跨境S2B2C供应链系统推荐:核货宝外贸分销S2B2C平台深度赋能B端、极致服务C端
  • 【OS笔记24】:存储管理3-分页管理-页表与快表
  • 城乡和住房建设厅网站首页深圳网站建站的公司
  • 湖湘杯网络安全技能大赛参与形式
  • 网站怎么上传模板优化设计七年级上册英语答案