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信息。
1. 在数据库hang的时间段内,有691个session在等待'enq: TA - contention','enq: TA - contention'的持有者是session#931,serial#39657

2. session#931,serial#39657 也是处于等待状态,等待事件是'gc buffer busy acquire',而'gc buffer busy
acquire'的持有者是session#1324,serial#22503

3. 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)