1.现象:
客户10.2.0.4 RAC环境,出现大量的library cache lock和cursor: pin S wait on X等待,经分析是由于统计信息收集僵死导致的。
数据库在8点到9点期间,数据库两个节点都存在明显的cursor: pin S wait on X和library cache lock的等待:
TOP 5 EVENT:
|
Event |
Waits |
Time(s) |
Avg Wait(ms) |
% Total Call Time |
Wait Class |
|
cursor: pin S wait on X |
1,573,056 |
30,651 |
19 |
146.2 |
Concurrency |
|
library cache lock |
31,757 |
7,009 |
221 |
33.4 |
Concurrency |
|
CPU time |
6,416 |
30.6 |
|||
|
DFS lock handle |
12,381 |
2,979 |
241 |
14.2 |
Other |
|
latch: library cache |
1,646 |
1,974 |
1,199 |
9.4 |
Concurrency |
|
Event |
Waits |
Time(s) |
Avg Wait(ms) |
% Total Call Time |
Wait Class |
|
cursor: pin S wait on X |
17,586,451 |
342,437 |
19 |
812.1 |
Concurrency |
|
library cache lock |
63,657 |
30,153 |
474 |
71.5 |
Concurrency |
|
CPU time |
3,820 |
9.1 |
|||
|
db file sequential read |
241,761 |
1,094 |
5 |
2.6 |
User I/O |
|
inactive session |
两个节点的等待现象基本一致,而节点1上还存在明显的DFS lock handle等待事件。
通过分析ASH信息,发现library cache lock和cursor: pin S wait on X等待基本上都是6点之后才开始出现:
2.分析原因
SELECT trunc(sample_time, 'hh24') TIME, COUNT(*) FROM WRH$_ACTIVE_SESSION_HISTORY ash, wrh$_event_name en WHERE ash.event_id = en.event_id AND sample_time>= to_timestamp('20130703', 'yyyymmdd') AND event_name IN ('cursor: pin S wait on X', 'library cache lock') GROUP BY trunc(sample_time, 'hh24') ORDER BY 1;
而观察出现cursor: pin S wait on X和library cache lock等待会话的BLOCKING SESSION,发现大部分处于等待的会话被会话37锁定:
SELECT to_char(sample_time, 'hh24:mi:ss.ff') TIME, session_id sid, decode(en.event_name, 'cursor: pin S wait on X', to_number(substr(ltrim(to_char(p2, '0xxxxxxxxxxxxxxx')), 1, 8), 'xxxxxxxx'), blocking_session) b_sid, en.event_name FROM WRH$_ACTIVE_SESSION_HISTORY ash, wrh$_event_name en WHERE ash.event_id = en.event_id(+) AND instance_number = 1 AND sample_time >= to_timestamp('201407140800', 'yyyymmddhh24mi') AND sample_time <= to_timestamp('201407140801', 'yyyymmddhh24mi') ORDER BY 1;
可以判断,导致数据库实例HANG死的原因是因为SID为73的进程:
SELECT to_char(sample_time, 'hh24:mi:ss'), program, action, event_name FROM wrh$_active_session_history ash, wrh$_event_name en WHERE session_id = 73 AND ash.event_id = en.event_id(+) AND sample_time >= to_date('201307140550', 'yyyymmddhh24mi') AND sample_time <= to_date('201307140601', 'yyyymmddhh24mi') ORDER BY 1;
根据MOS文档,Bug 6011045 – DBMS_STATS causes deadlock between ‘cursor: pin S wait on X’ and ‘library cache lock’ [ID 6011045.8],这个问题是RAC环境中Oracle收集统计信息的BUG,在自动收集数据字典信息时,可能会出现进程HANG死,并导致大量的library cache lock和cursor: pin S wait on X等待,此外还可能出现DFS lock handle以及row cache lock的等待。
这个BUG确认影响版本包括10.2.0.4和10.2.0.5,这个BUG Oracle在10.2.0.5.5 PSU中进行了修复。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25462274/viewspace-2089049/ ,如需转载,请注明出处,否则将追究法律责任。