gc buffer busy需拆解为acquire和release两类:acquire是远程块未送达,主因lgwr写日志慢或私网延迟高;release是远程端释放卡住,根因ges协调饱和或长事务回滚。

gc buffer busy 等待事件本身不说明问题根源,必须立刻拆解为 acquire 和 release 两类——它们的成因、排查路径和修复手段完全不同。
gc buffer busy acquire 是“抢不到”,本质是远程块还没给过来
它表示本地会话已发起请求,但远程实例还没完成当前块的构造或传输。这不是锁没释放,而是块还在路上。
- 常见诱因是
gc cr block flush time或gc current block flush time过高,根本卡在 LGWR 写日志环节(比如log file sync平均耗时 >10ms) - AWR 中
Avg global cache cr block receive time>5ms 就该警觉;若 >100ms,基本可断定是远端 LGWR 被阻塞(如日志切换卡住、存储写慢、redo 日志文件所在磁盘 I/O 饱和) -
Segments by Global Cache Buffer Busy排第一的对象,大概率是高频更新+读的索引叶块(例如按时间递增插入的流水表主键索引),此时优化方向是打散物理分布,不是改 SQL - 别查
sql_id:90% 场景下,gv$session里state = 'WAITING'且sql_id为空,说明卡在 GC 消息层,SQL 根本还没执行
gc buffer busy release 是“交不出”,本质是远程端释放动作卡住了
它表示本地会话已完成处理,正等待远程实例把锁/资源真正归还。这不是访问太猛,是释放太慢——优化 SQL 几乎无效。
- 典型信号是
gv$system_event中gc buffer busy release占比超 30%,且与gc buffer busy acquire同时飙升 - 直接查
gv$process,过滤program = 'ora_lmd_*',看pga_used_mem是否持续 >200MB:超了说明 GES 协调能力已饱和 - 私网延迟必须测
8KB包(不是默认56字节),Interconnect Ping Latency Statistics里平均值 >1.5ms 就得调 MTU 或交换机 QoS - 以下操作极易触发 release 爆涨:
TRUNCATE表(尤其跨实例)、批量UPDATE后不COMMIT、ALTER SYSTEM KILL SESSION强制杀会话后残留锁
别被 AWR 的“热块”误导:真正的瓶颈常在协调层
很多人盯着 Segments by Global Cache Buffer Busy 去重建索引或分区,但若 gc buffer busy release 占主导,热点根本不在数据块,而在 LMD/GES 协调链路。
- 查
gv$ges_blocking_enqueue,找长期卡在enq: TX - row lock contention或enq: US - contention的会话——它拖慢的是整个释放链条 - 确认是否触发 Oracle Bug:例如
Bug 24303124在特定 19c 版本下会导致 RELEASE 消息静默丢失,需打补丁 -
gv$transaction中used_ublk异常高(比如 >5000),说明长事务回滚中正在清理大量 PI 块,释放路径天然变长
最易忽略的一点:当 gc buffer busy acquire 和 gc buffer busy release 同时高企,且 log file sync 时间也偏高时,不要分头排查——它们很可能是同一根链条上的不同症状,优先拿下 LGWR 和私网这两个硬性瓶颈,GC 等待常会连带收敛。











