RAC gc buffer busy 等待事件简单说明(转)
2017-01-21 11:48
621 查看
转自:http://blog.itpub.net/12798004/viewspace-1341858/
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。
在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)
应用端反映业务处理异常,数据库hang,在第一时间现场DBA收集了hanganalyze (hanganalyze对于分析数据库hang非常重要)
RAC数据库收集hanganalyze的命令:
通过hanganalyze我们可以比较容易看到有1000个以上的Chain都有类似的等待关系,比如:
Hanganalyze说明数据库中大部分session直接或者间接等待’gc current request’<=’gc buffer busy acquire’。
有些情况下dia0 trace文件也会记录hang信息
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)
概述
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 sysdba SQL> oradebug setmypid SQL> oradebug unlimit SQL> 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)
相关文章推荐
- RAC性能分析 - gc buffer busy acquire 等待事件
- 【Oracle数据库技术支持】RAC性能分析 - gc buffer busy acquire 等待事件
- 找到RAC中导致gc buffer busy等待事件的热点块
- RAC性能分析gc buffer busy acquire 等待事件
- gc buffer busy等待事件
- GC Buffer Busy等待事件
- Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明--转载(http://blog.csdn.net/tianlesoftware/article/details/7777511)
- Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明
- gc buffer busy等待事件
- Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明
- Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明
- GC Buffer Busy等待事件
- gc buffer busy等待事件
- buffer busy waits等待事件的原因:hot block [转]
- 模拟产生CBC LATCH与buffer busy wait等待事件
- buffer busy waits - 等待事件
- oracle等待事件4——buffer busy wait 特别介绍
- 模拟产生CBC LATCH与buffer busy wait等待事件
- 模拟buffer busy waits等待事件
- 等待事件 - buffer busy waits