如何分析Oracle19c RAC中gc buffer busy wait等待

陌强君_8675

陌强君_8675

2026-09-09

946人浏览

原创

awr中segments by global cache buffer busy是定位gc buffer busy wait根源最快方式,直接指出被跨实例争用的表或索引分区;重点看该列累计等待时间,排序靠前者即热块源头,且仅rac环境awr报告中存在。

如何分析oracle19c rac中gc buffer busy wait等待

直接看AWR里Segments by Global Cache Buffer Busy

这个视图是定位gc buffer busy wait根源最快的方式。它不依赖你猜SQL或查会话,而是直接告诉你哪张表、哪个索引分区在被跨实例争用。重点看Global Cache Buffer Busy列的累计等待时间,排序靠前的段基本就是热块源头。

注意:该统计只出现在RAC环境的AWR报告“Instance Activity Stats”之后的“Segment Statistics”章节里,单实例没有。如果报告里没出现,说明要么没开AWR快照,要么采样期间没触发足够多的GC交互。

  • 常见误判:看到gc buffer busy acquire就去查SQL执行计划——其实90%以上情况,问题不在SQL写法,而在数据物理分布
  • 真实场景中,SEGMENTS BY GLOBAL CACHE BUFFER BUSY里排第一的往往是流水表的主键索引,尤其是按时间+机构做的二级分区索引叶块
  • 如果同一对象在多个节点都高频出现,说明不是局部热点,而是全局热点(比如所有节点都在往同一个索引叶块插入)

用gv$session定位正在卡住的会话和资源类型

gv$session能实时抓到卡在gc buffer busy wait上的会话,比AWR更及时,适合压测中边调边看。关键不是看event字段,而是盯住p1和p2——它们指向具体被争用的资源。

p1通常是file#或object_id,p2是block#或class#。结合dba_objects反查对象名:

SELECT owner, object_name, subobject_name, object_type
FROM dba_objects 
WHERE object_id = &p1;

如果p2值是17或18,大概率是UNDO段头或UNDO块争用;如果是4,优先检查表段头(FREELIST或ASSM位图块)。

Crypto Sniper Oracle
Crypto Sniper Oracle

机构级量化市场预言机,提供订单簿失衡(OBI)、VWAP分析、自动化报告及Telegram预警。

下载
  • 别只查event = 'gc buffer busy acquire',gc buffer busy release同样重要——后者常被忽略,但代表释放方卡住了,可能因LMS进程CPU满或私网延迟
  • 如果state = 'WAITING'且sql_id为空,说明卡在GC消息层,还没走到SQL执行阶段
  • 在19c中,p3有时携带锁模式(如3=SS,5=SX),可辅助判断是读-读、读-写还是写-写冲突

区分acquire和release的根本差异

gc buffer busy acquire表示当前实例正试图从远端拿块,但远端还没给;gc buffer busy release表示当前实例已处理完块,却卡在把锁还回去的路上。两者根因完全不同,不能混着优化。

acquire高:说明请求端压力大或远端响应慢,优先排查网络延迟、LMS负载、目标块是否真热;release高:说明本机LMS进程忙不过来,或远端GES协调异常,甚至可能是Bug(如19c已知Bug 32541263影响release路径)。

  • 查LMS状态:SELECT inst_id, pid, spid, program FROM gv$process WHERE program LIKE '%LMS%'; 看CPU占用和SPID是否僵死
  • 查私网延迟:SELECT * FROM gv$sysstat WHERE name LIKE 'gc%latency%'; 关注gc cr block receive time和gc current block receive time的平均值,超500微秒就要警惕
  • release类等待在AWR中常伴随ges messages send time升高,这是GES层瓶颈的强信号

绕过gc buffer busy的物理设计要点

分析清楚后,修复动作往往不在SQL或参数,而在表/索引结构。核心思路是让并发写入尽量分散到不同块、不同实例,减少跨节点GC需求。

对流水类表,最有效的是:一级按时间范围分区(如RANGE (create_time)),二级按业务维度哈希分区(如HASH (org_id)),且哈希分区数必须是2的幂(如64),避免Oracle内部哈希冲突放大。

  • 索引必须和表一样做两级分区,尤其主键索引——否则索引叶块仍会成为单点热块
  • 禁用FREELIST,改用ASSM,但要确保INITIAL和NEXT大小合理,避免小扩展引发段头争用(class#=4)
  • 如果业务允许,把高频插入的列默认值设为SYS_GUID()或DBMS_RANDOM.STRING(),打散插入位置,比调pctfree更治本

真正难的不是查出哪块热,而是确认那块热是因为设计缺陷,还是因为某条SQL在错误时间批量刷了10万行进同一个分区——后者需要结合ASH抽样和SQL执行频次交叉验证,容易漏掉。

相关文章

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

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

下载

相关标签:

oracle

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

相关专题

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

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

2023.08.16

881

5

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

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

2023.09.15

2493

5

oracle怎么分页
oracle怎么分页

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

2023.09.18

2530

5

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

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

2023.09.19

1449

3

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

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

2023.09.19

2053

7

oracle imp
oracle imp

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

2023.09.19

2689

4

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

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

2023.11.02

4269

19

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

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

2023.11.08

237

5

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

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

2023.11.14

686

5

热门下载

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

精品课程

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