很多情况下,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 output, no process dump at all