方式一、做hanganalyze
单机:
sqlplus -prelim /nolog
connect / as sysdba
oradebug setmypid
oradebug hanganalyze 3
oradebug dump systemstate 266
oradebug tracefile_name
RAC:
#sqlplus / as sysdba
SQL> oradebug setmypid
SQL> oradebug unlimit
SQL> oradebug -g all hanganalyze 3
wait 120 seconds........
SQL> oradebug -g all hanganalyze 3
SQL> oradebug tracefile_name
SQL> exit
方式二、gdb调用进程输出
使用prelim参数仍然无法登录数据库时,可以使用gdb调试后台进程方式生成systemstate dump,例子如下:
[oracle@db ~]$ ps -ef|grep pmon
oracle 2565 1 0 17:52 ? 00:00:02 ora_pmon_orcl
root 4163 2608 0 18:17 pts/1 00:00:00 grep pmon
You have new mail in /var/spool/mail/root
[oracle@db ~]$ gdb $ORACLE_HOME/bin/oracle 2565
。。。。。。。。
(gdb) print ksudss(10)
$1 = 0
(gdb) detach
Detaching from program: /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle, process 2565
生成orcl_pmon_2565.trc
分析hanganalyze
BLOCK进程一般会在State of ALL nodes部分的以下状态的会话中产生,主要有LEAF,NLEAF,IN_HANG进程。
对于LEAF,NLEAF类,把LEAF,NLEAF的对象过滤出来
cat $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/orcl_ora_38521.trc|grep LEAF
如:
State of ALL nodes([nodenum]/cnode/sid/sess_srno/session/ospid/state/[adjlist]):[134]/1/135/1/0xf27dd190/21691/SINGLE_NODE/[198]/1/199/895/0xf2894610/6802/LEAF/ ---##LEAF堵塞者[388]/2/141/209/0xf27cac50/8132/SINGLE_NODE/[445]/2/198/1741/0xf28976f0/10653/NLEAF/[198] ---##NLEAF被堵塞者
LEAF一般都是堵塞者,找到对应列的ospid列的值,然后通过OS层面去kill -9杀掉进程,KILL 前一定要ps 看下是不是系统进程
对于IN_HANG类,把IN_HANG的对象过滤出来
cat $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/orcl_ora_27259.trc|grep IN_HANG
如:
[nodenum]/cnode/sid/sess_srno/session/ospid/state/start/finish/[adjlist]/predecessor
[16]/0/17/154/0x24617be0/26800/IN_HANG/29/32/[185]/19
[185]/1/16/4966/0x24617270//IN_HANG/30/31/[16]/16
在此示例中,节点[16]正在等待节点[185],反之亦然;这是一个循环条件(死锁)。
IN_HANG一般都是堵塞者,但是基本上不止一条,找到对第一个堵塞者的SPID,通过OS层面去kill -9杀掉进程
KILL 前一定要ps 看下是不是系统进程