Oracle RAC構成をしていると、gc cr failure による待機イベントに泣かされることが多々ある日々です。 原因は不明ですがいつまでたっても gc cr failure が終了せずに長時間セッションとなってしまいます。
そんな gc cr failure による長時間処理が発生した場合には、まず長時間動き続けているセッションを確認する必要があります。 次のSQLで該当セッションのセッションIDを確認します。
SELECT last_call_et, sid, serial#, state, event, username, machine, status, q.sql_id FROM v$session s left join v$sqltext q on(s.sql_id = q.sql_id) WHERE type = 'USER' AND STATUS = 'ACTIVE' group by last_call_et, sid, serial#, state, event, username, machine, status, q.sql_id ORDER BY last_call_et desc
結果は下記のような感じ。
これで長時間動き続けているSQLのセッションが確認できましたので、今度はこのSIDを参考に gc cr request を繰り返しているオブジェクトを特定します。
まずはイベント gc cr request が発生している待機セッションの file と block を確認します。 次のSQLを実行して該当のセッションが存在してるかを確認します。P1値が file で、P2値が block を指します。
select SID, p1, P2 from v$session_wait where EVENT = 'gc cr request'
結果は下記のような感じ。
最後に取得したP1とP2の値で該当のオブジェクトを確認します。
SELECT segment_name, segment_type, owner, tablespace_name FROM dba_extents WHERE file_id = 5 AND 120916351 between block_id AND block_id + blocks - 1
結果が下記。
これでどのオブジェクトが原因で gc cr failure が発生し続けているかを特定できました。