1g之前,通常我们数据库hang住了之后,我们会对数据库做hang analyze来进行分析,在11g之后,我们可以通过一个新的视图v$wait_chains来诊断数据库hang和contention。在11gR1这个版本里面,Oracle通过diag进程实现了一个功能,每隔3秒做一次本地的hang analyze,每隔10秒做一次global的hang analyze。而这些信息会存放在内存里面,Oracle把这一块内存称作”hang analysis cache”。而这一部分内存信息,对我们数据库诊断hang和contention起着非常重要的作用。而数据库还有一些特性及工具也需要使用这块内存区域。比如Hang Management, Resource Manager Idle Blocker Kill, SQL Tune Hang Avoidance和pmon清除,还有一些外部工具如Procwatcher。
我们看一下v$wait_chains视图的定义。以11gR2为例。
SQL> desc v$wait_chains
Name Null? Type ----------------------------------------- -------- ---------------------------- CHAIN_ID NUMBER CHAIN_IS_CYCLE VARCHAR2(5) CHAIN_SIGNATURE VARCHAR2(801) CHAIN_SIGNATURE_HASH NUMBER INSTANCE NUMBER OSID VARCHAR2(25) PID NUMBER SID NUMBER SESS_SERIAL# NUMBER BLOCKER_IS_VALID VARCHAR2(5) BLOCKER_INSTANCE NUMBER BLOCKER_OSID VARCHAR2(25) BLOCKER_PID NUMBER BLOCKER_SID NUMBER BLOCKER_SESS_SERIAL# NUMBER BLOCKER_CHAIN_ID NUMBER IN_WAIT VARCHAR2(5) TIME_SINCE_LAST_WAIT_SECS NUMBER WAIT_ID NUMBER WAIT_EVENT NUMBER WAIT_EVENT_TEXT VARCHAR2(64) P1 NUMBER P1_TEXT VARCHAR2(64) P2 NUMBER P2_TEXT VARCHAR2(64) P3 NUMBER P3_TEXT VARCHAR2(64) IN_WAIT_SECS NUMBER TIME_REMAINING_SECS NUMBER NUM_WAITERS NUMBER ROW_WAIT_OBJ# NUMBER ROW_WAIT_FILE# NUMBER ROW_WAIT_BLOCK# NUMBER ROW_WAIT_ROW# NUMBER
继续查询该视图的定义。可以发现该数据来自于基表x$ksdhng_chains。因为前面介绍过进程会10秒做一次global的hang,所以这个视图是包含了全局的信息的。虽然它是v$开头的。
SQL> select * from V$FIXED_VIEW_DEFINITION where view_name like '%WAIT_CHAINS%'; VIEW_NAME VIEW_DEFINITION -------------------- ---------------------------------------------------------------------------------------------------------------------------------- V$WAIT_CHAINS select s.chain_id, decode(s.chain_is_cycle, 0,'FALSE','TRUE'), s.chain_signature, s.chain_signature_hash, s.instance, s.osid, s.pid, s.sid, s.sess_serial#, decode(s.blocker_is_valid, 0,'FALSE','TRUE'), decode(s.blocker_is_valid, 0, to_number(null), s. blocker_instance), s.blocker_osid, decode(s.blocker_is_valid, 0, to_number(null), s.blocker_pid), decode(s.blocker_is_valid, 0, to_number(null), s.blocker_sid), decode(s.blocker_is_valid, 0, to_number(null), s.blocker_sess_serial#), decode(s.blocker_chain _id, 0, to_number(null), s.blocker_chain_id), decode(s.in_wait, 0,'FALSE','TRUE'), decode(s.in_wait, 0, s.time_since_last_wait _secs, to_number(null)), decode(s.in_wait, 0, to_number(null), s.wait_id), decode(s.in_wait, 0, to_number(null), s.wait_event), s.wait_event_text, decode(s.in_wait, 0, to_number(null), s.p1), s.p1_text, decode(s.in_wait, 0, to_number(null), s.p2), s.p2 _text,