gc remaster和gcs drm freeze in同时出现且时间重合即表明DRM正在执行重主操作;前者表示LMD0启动资源迁移,后者说明GRD冻结同步状态,导致跨节点块请求挂起。

看Top 5里有没有gc remaster和gcs drm freeze in
这两个等待事件是DRM正在执行重主操作的直接证据,不是“可能相关”,而是“必定在发生”。gc remaster表示LMD0已启动资源迁移;gcs drm freeze in说明GRD正在冻结以同步状态——此时所有跨节点块请求都会卡住,业务SQL会突然挂起几秒甚至更久。
常见误判:只盯着gc buffer busy acquire或enq: TX - row lock contention,但它们只是DRM引发的连锁反应。真正根因信号必须是gc remaster平均等待 >100ms 或频次突增(比如从每小时几次跳到每分钟几十次)。
- 查法:打开AWR报告 → 找「Top 5 Timed Foreground Events」→ 拉到底部「Wait Event Histogram」,确认
gc remaster是否落在16–32ms或更高桶位 - 注意:RAC默认不把
gcs drm freeze in放进Top 5,得手动翻到「Wait Events」完整列表里搜 - 如果这两项同时出现且时间窗口高度重合(误差
核对LMD trace中DRM start频次是否异常
AWR只记录结果,LMD trace才记录动作细节。DRM start在trace里每出现一次,就代表一次完整的资源重主流程启动,伴随GRD冻结、锁广播、master迁移三步。高频触发=频繁挂起。
生产环境正常情况:每小时≤1次;若发现连续10分钟内出现5次以上DRM start,就是典型的“DRM锁重构风暴”,尤其当它集中在某几个表或索引上时。
- 路径:$ORACLE_HOME/rdbms/log/lmd*.trc(注意是lmd*,不是lms或lmon)
- 命令:
grep "DRM start\|remastering" lmd_1.trc | head -20,看时间戳是否密集 - 关键陷阱:别只查一个节点的trace——RAC中DRM由LMD0发起,但各节点LMD进程都可能写入自己的trace,必须全集群比对
交叉验证x$object_affinity_statistics.opens是否暴涨
x$object_affinity_statistics.opens是Oracle内部统计每个对象被“非master节点”访问的次数。DRM触发阈值由_gc_affinity_limit控制,一旦某对象的opens超过该值,就会触发重主。所以这个视图的突增,等于提前预告了DRM即将发作。
它不像等待事件那样滞后,而是先于挂起出现——相当于DRM的“预警指标”。很多DBA等到gc remaster排队才反应,其实这时已经晚了。
- 查法:
SELECT object_name, opens FROM x$object_affinity_statistics WHERE opens > 500 ORDER BY opens DESC; - 对比基线:平时
opens稳定在个位数或0,某次批量插入后飙升到2000+,且对应对象正是挂起SQL访问的表/索引 - 注意:该视图只在
_gc_affinity_time > 0时更新;如果已禁用DRM,这里长期为0是正常的
别漏掉AWR快照间隔导致的“假阴性”
DRM引发的瞬时挂起往往只持续几秒到十几秒,而默认AWR快照间隔是60分钟。这意味着:即使挂起真实发生过,AWR报告也可能完全不体现——因为快照没抓到那几秒的峰值等待。
这不是数据不准,是采样粒度问题。你看到的“Top 5里没有gc remaster”,很可能只是它没被拍进快照里。
- 解决办法:把快照间隔调到15分钟(
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(interval => 15)),并在问题时段前后手动补采:EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); - 更准的做法:配合ASH查实时痕迹,运行
SELECT * FROM gv$active_session_history WHERE event LIKE 'gc%remaster%' AND sample_time > SYSDATE-1/1440;(查过去1分钟) - 最易忽略点:RAC中不同实例的快照时间可能错开——节点1快照在11:00:00,节点2在11:00:30,而挂起发生在11:00:15,结果两边AWR都“看不到”


















