很多情况下,Oracle hang导致sqlplus无法连接,从而无法获得Oracle系统和进程状态,使得定位问题缺少强有力的依据。


所幸的是Oracle 10g推出了sqlplus -prelim选项,在Oracle挂起时依然能使用sqlplus,从而能获得数据库状态。 
使用方法如下 

[oracle@HadoopNameNode ~]$ sqlplus -prelim / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Tue Aug 25 11:06:14 2015
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
SQL

在prelim模式下,不可以查询数据字典,但可以关闭数据库 

SQL>  select status from v$instance
select status from v$instance
*
ERROR at line 1:
ORA-01012: not logged on
Process ID: 0
Session ID: 0 Serial number: 0

关闭数据库
SQL> shutdown abort 
ORACLE instance shut down.

对于实例级别hang,通常建议收集如下信息:

[oracle@HadoopNameNode ~]$ sqlplus -prelim / as  sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Tue Aug 25 11:19:49 2015
Copyright (c) 1982, 2011, Oracle.  All rights reserved.

SQL>  oradebug setmypid
Statement processed.
SQL> oradebug dump systemstate 10;
Statement processed.
SQL> oradebug tracefile_name
/home/u01/app/oracle/diag/rdbms/ytzx/ytzx/trace/ytzx_ora_8611.trc


果是rac:

SQL> ORADEBUG setmypid
SQL> ORADEBUG setinst all
SQL> ORADEBUG -g def hanganalyze  266
SQL> oradebug tracefile_name


对于应用hang,建议进行hanganalyze 分析即可 dump hanganalyze



SQL> oradebug setmypid
SQL> oradebug  hanganalyze 3 
Statement processed.
SQL> oradebug tracefile_name
/home/u01/app/oracle/diag/rdbms/ytzx/ytzx/trace/ytzx_ora_8611.trc

对于rac 

SQLPLUS> oradebug setmypid 
SQLPLUS>oradebug setinst all 
SQLPLUS>oradebug -g def hanganalyze 3


如果sqlplus无法登陆,那么建议进行os层面的数据收集。例如如下:

dbx -a PID (where PID = any oracle shadow process)       ---通过ps -ef|grep xxx查看
dbx() print ksudss(10)
...return value printed here
dbx() detach

 hanganalyze有如下几种level
 10     Dump all processes (IGN state)
 5      Level 4 + Dump all processes involved in wait chains (NLEAF state)
 4      Level 3 + Dump leaf nodes (blockers) in wait chains (LEAF,LEAF_NW,IGN_DMP state)
 3      Level 2 + Dump only processes thought to be in a hang (IN_HANG state)
 1-2    Only HANGANALYZE outputno process dump at all