为什么Oracle ASH报告中的等待事件与AWR不一致

星婷酱_9174

星婷酱_9174

2026-10-30

220人浏览

原创

ASH每秒采样活跃会话,AWR每小时聚合采样,瞬时锁(如14:07持锁4分钟)易被AWR快照遗漏;ASH可区分TX锁mode=4/6,AWR仅统一归类为enq: TX - row lock contention。

为什么oracle ash报告中的等待事件与awr不一致

ASH报告里看到的enq: TX - row lock contention,AWR里却没出现

因为ASH和AWR根本不是同一套采样逻辑,不是“谁更准”,而是“谁在什么时间、以什么方式记了什么”。ASH每秒抓一次活跃会话,只存内存、只留约1小时;AWR每小时从ASH里抽一次样,再存到磁盘,默认保留8天。你查的那5分钟锁问题,如果发生在AWR两次快照中间(比如14:23),它大概率不会被AWR捕获——AWR只会记录14:00和15:00两个时间点的聚合值,中间的尖刺直接被平均掉了。

常见错误现象:enq: TX - row lock contention在ASH里高频出现(>20次/5分钟),但在AWR的Top 5 Timed Events里排不进前五,甚至压根不显示。

  • 别急着怀疑权限或配置,先确认时间窗口:ASH报告必须限定SAMPLE_TIME > SYSDATE - 5/1440,否则默认扫全内存ASH buffer(约1小时),可能因权限不足报ORA-00942
  • AWR报告中该事件占比低,不代表没发生,只说明它没持续到整点快照时刻——锁可能在14:07持有了4分钟,14:11就释放了,但14:00和15:00两个快照都“错过”了
  • 若需长期追踪这类瞬时锁,得用DBA_HIST_ACTIVE_SESS_HISTORY(即AWR归档的ASH),但它依赖AWR采样频率,仍不如实时查gv$active_session_history可靠

为什么ASH显示final_blocking_session=0,AWR里却显示blocking_session有值

这是RAC环境下最典型的视图错位。blocking_session字段只存在于v$session和DBA_HIST_ACTIVE_SESS_HISTORY(AWR归档版ASH),它只反映本实例内的阻塞链局部信息;而final_blocking_session是gv$active_session_history才有的字段,专为跨实例定位根因设计。

使用场景:你在实例1上查AWR,看到SQL等待被SID 123阻塞;但去查实例1的v$session,发现SID 123本身也在等——它其实在等实例2上的某个会话。这个“实例2的会话”就是final_blocking_session,而它的final_blocking_instance必须配合查,否则你连它在哪台机器上都不知道。

  • 查gv$active_session_history时,必须显式SELECT final_blocking_session和final_blocking_instance,不能只SELECT *——很多脚本漏掉这两列,导致误判
  • final_blocking_session = 0或NULL,基本可断定是根阻塞源,90%对应的是未提交的批处理语句,比如UPDATE /*+ PARALLEL */ ... WHERE batch_id = ?
  • AWR报告里的Top Blocking Sessions章节,底层查的是DBA_HIST_ACTIVE_SESS_HISTORY,它没有final_blocking_*字段,所以天然无法还原RAC真实阻塞路径

ASH里p1raw='54580004',但AWR把这算成enq: TX - row lock contention

AWR不做事件细分,它只按event字符串归类。而enq: TX - row lock contention这个字符串,在底层实际覆盖了两种完全不同的机制:mode=6(真行锁)和mode=4(ITL争用或唯一键冲突)。ASH能通过p1raw后两位精准区分,AWR不能。

QuantOracle
QuantOracle

63个确定性量化金融计算器 + 10个通过MCP的复合工作流。期权定价、Greeks、奇异衍生品、风险指标、投资组合优化……

下载

性能影响很关键:杀掉mode=4的等待者毫无意义——下一个会话立刻重试,还是报ORA-00001或继续等。但AWR报告里它和mode=6混在一起统计,容易误导你去kill错对象。

  • 验证是否唯一键冲突:查sql_id对应语句是否为INSERT INTO ... VALUES (),且CURRENT_OBJ#指向唯一索引所在表
  • 验证是否ITL不足:看等待会话的ROW_WAIT_BLOCK#是否高度集中(比如连续多行都是同一block号),同时v$segment_statistics中该表的ITL waits计数上升
  • AWR的Segments by Row Lock Waits章节其实也分不清mode,它只是把所有enq: TX%事件的CURRENT_OBJ#做频次统计,所以高亮的表未必是被锁的表,可能是唯一约束触发的级联更新目标

为什么ASH报告生成后,某些会话的SQL_ID在AWR里查不到

因为ASH采样的是“正在执行”的会话快照,哪怕SQL刚执行100ms就被采到,也会记下sql_id;但AWR只收录那些“完成执行”且满足阈值的SQL——默认要求elapsed_time > 5s或buffer_gets > 1000才会进DBA_HIST_SQLSTAT。短平快的锁等待SQL(比如单行UPDATE后立即卡住),很可能在ASH里高频出现,但在AWR SQL Statistics里完全隐身。

容易踩的坑:看到ASH里sql_id = '2xb71ufa5wmrh'反复出现,就去AWR里搜它,结果找不到执行计划。这不是数据丢了,是它根本没达到AWR的收录门槛。

  • 要查这类短SQL的真实执行计划,得立刻查v$sql_plan(还在共享池里)或gv$sql_plan(RAC环境)
  • 如果SQL已老化出共享池,只能靠DBA_HIST_SQL_PLAN,但它依赖AWR采样,同样受5秒阈值限制
  • 真正可靠的链路是:ASH → sql_id → gv$session查prev_sql_id或sql_child_number → 再反查v$sql获取绑定变量和实际执行计划

真实排查中,最常被忽略的是:ASH和AWR不是互为备份的关系,而是互补的观测层。你不能指望AWR告诉你“谁在14:07:23卡住了”,也不能靠ASH回答“过去一周哪条SQL逻辑读最高”。它们各自有不可替代的盲区,混用时必须清楚每一行数据背后的采样逻辑和生命周期。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

oracle oracle ash

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
oracle清空表数据
oracle清空表数据

当表中的数据不需要时,则应该删除该数据并释放所占用的空间。本专题为大家提供oracle清空表数据的相关文章,帮助大家解决该问题。

2023.08.16

1061

5

Oracle中declare的使用
Oracle中declare的使用

Oracle DECLARE语句是PL/SQL编程语言中用于声明变量、常量、游标或异常的关键字。它的主要作用是在程序中定义这些对象,以便在后续的代码中使用。DECLARE语句的语法简单明了,可以根据需要声明多个对象。通过使用这些声明的对象,可以进行各种操作,如计算、查询数据库、处理异常等 。

2023.09.15

3113

5

oracle怎么分页
oracle怎么分页

实现分页的步骤:1、使用ROWNUM进行分页查询;2、在执行查询之前进行设置分页参数;3、使用"COUNT(*)"函数来获取总行数,并使用"CEIL"函数来向上取整计算总页数;4、在外部查询中使用"WHERE"子句来筛选出特定的行号范围,以实现分页查询。想了解更多oracle怎么分页的文章,可以来阅读本专题先的文章。

2023.09.18

3130

5

Oracle查看表操作历史记录
Oracle查看表操作历史记录

查看操作历史记录的方法:1、使用Oracle内置的审计功能,可以记录数据库中发生的各种操作,包括登录、DDL语句、DML语句等;2、使用Oracle日志文件,其中包含了数据库中发生的各种操作,可以通过查看日志文件来获取操作历史记录;3、使用Oracle的Flashback功能,可以查看数据库在某个时间点的操作历史记录;4、使用第三方工具等。本专题还提供其他查看表操作的文章,大家可以免费阅读。

2023.09.19

1769

3

Oracle中RAC的用法
Oracle中RAC的用法

Oracle中RAC的用法:1、通过在多个服务器上运行数据库实例来提供高可用性;2、允许在需要时增加或减少节点数量;3、通过将工作负载分布到多个节点上来实现负载均衡;4、使用共享存储来实现多个节点之间的数据共享;5、允许多个节点同时处理数据库请求,从而实现并行处理;6、提供了透明故障切换功能;7、使用了一些技术来确保数据的一致性;8、提供了管理工具来简化RAC环境的管理和维护。本专题还提供RAC相关的其他文章,大家可以免费阅读。

2023.09.19

2393

7

oracle imp
oracle imp

imp是Oracle数据库中的一个命令行工具,用于将导出的数据和对象从一个数据库实例导入到另一个数据库实例。imp命令的一般语法为“imp username/password@connect_string file=file_name [options]”。

2023.09.19

3289

4

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4709

19

oracle通配符有哪些
oracle通配符有哪些

oracle通配符有“%”、“_”、“[]”和“[^]"。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.08

257

5

oracle四舍五入怎么操作
oracle四舍五入怎么操作

oracle四舍五入操作可以使用ROUND函数来实现,其语法为“ROUND(number, decimal_places)”,其中,number是要进行四舍五入的数值,decimal_places是指定的小数位数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.14

846

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程