概述
gc buffer busy 是 RAC 数据库中常见的等待事件,11g 开始 gc buffer busy 分为 gc buffer busy acquire 和 gc buffer busy release。
gc buffer busy acquire 是当 session#1 尝试请求访问远程实例 (remote instance) buffer,但是在 session#1 之前已经有相同实例上另外一个 session#2 请求访问了相同的 buffer,并且没有完成,那么 session#1 等待 gc buffer busy acquire。
gc buffer busy release 是在 session#1 之前已经有远程实例的 session#2 请求访问了相同的 buffer,并且没有完成,那么 session#1 等待 gc buffer busy release。
原因 / 解决方法
热点块 (hot block)
在 AWR 中 Segments by Global Cache Buffer Busy 记录了访问频繁的 gc buffer.
解决方法可以根据热点块的类型采取不同的解决方法,比如采取分区表,分区索引,反向 index 等等。这点与单机数据库中的 buffer busy waits 类似。
低效 SQL 语句
低效 SQL 语句会导致不必要的 buffer 被请求访问,增加了 buffer busy 的机会。在 AWR 中可以找到 TOP SQL。解决方法可以优化 SQL 语句减少 buffer 访问。这点与单机数据库中的 buffer busy waits 类似。
数据交叉访问。
RAC 数据库,同一数据在不同数据库实例上被请求访问。
如果应用程序可以实现,那么我们建议不同的应用功能 / 模块数据分布在不同的数据库实例上被访问,避免同一数据被多个实例交叉访问,可以减少 buffer 的争用,避免 gc 等待。
Oracle bug
建议安装 Oracle 推荐的最新 Patch Set 和 PSU。
Patch set 和 PSU 信息请参考:Oracle Recommended Patches – Oracle Database (Doc ID 756671.1)
案例分享
一个 gc buffer busy acquire 的案例,和大家分享一下。
应用端反映业务处理异常,数据库 hang,在第一时间现场 DBA 收集了 hanganalyze (hanganalyze 对于分析数据库 hang 非常重要)
RAC 数据库收集 hanganalyze 的命令:
- SQL> conn / as sysdbaSQL> oradebug setmypidSQL> oradebug unlimitSQL> oradebug -g all hanganalyze 3
通过 hanganalyze 我们可以比较容易看到有 1000 个以上的 Chain 都有类似的等待关系,比如:
- Chain 1 Signature: 'gc current request'<='gc buffer busy acquire'<='enq: TX - contention'Chain 2 Signature: 'gc current request'<='gc buffer busy acquire'<='buffer busy waits'…Chain 1243 Signature: 'gc current request'<='gc buffer busy acquire'<='enq: TA - contention'Chain 1244 Signature: 'gc current request'<='gc buffer busy acquire'<='enq: TA - contention'
Hanganalyze 说明数据库中大部分 session 直接或者间接等待'gc current request'<='gc buffer busy acquire'。
有些情况下 dia0 trace 文件也会记录 hang 信息
- inst# SessId Ser# OSPID PrcNm Event ----- ------ ----- --------- ----- ----- 1 1152 3 21364904 FG gc buffer busy acquire 1 2481 3 26607642 FG gc current request
Chain 1 Signature: 'gc current request'<='gc buffer busy acquire'
Chain 1 Signature Hash: 0x8823aa2a
有些情况下 dba_hist_active_sess_history 也会记录 hang 信息。
在数据库 hang 的时间段内,有 691 个 session 在等待'enq: TA - contention','enq: TA - contention'的持有者是 session#931,serial#39657
session#931,serial#39657 也是处于等待状态,等待事件是'gc buffer busy acquire',而'gc buffer busy
acquire'的持有者是 session#1324,serial#22503
session#1324,serial#22503 也是处于等待状态,等待事件是'gc current request'
通过分析 dba_hist_active_sess_history,也可以得到 session 等待关系:
'gc current request'<='gc buffer busy acquire'<='enq: TA - contention'
这个等待关系与 hanganalyze 是一致的。
根据以上分析得到 session 等待关系,可以确定数据库 hang 的原因是 oracle 已知问题 Bug
13787307 - Hang in RAC with 'gc current request'<='gc buffer busy acquire' signature.
解决方法:
安装 Patch 13787307 或者 设置_gc_bypass_readers=false 临时规避这个问题。
另外,在 11.2 低版本中也有些类似的已知问题,建议安装最新 patch set (11.2.0.3/4) + 最新 PSU 。
Patch set 和 PSU 信息请参考:Oracle Recommended Patches – Oracle Database (Doc ID 756671.1)
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: