天天看点

Oracle hang 之sqlplus -prelim方法

   很多情况下,Oracle hang导致sqlplus无法连接,从而无法获得Oracle系统和进程状态,使得定位问题缺少强有力的依据。 所幸的是Oracle 10g推出了sqlplus -prelim选项,在Oracle挂起时依然能使用sqlplus,从而能获得数据库状态。 

使用方法如下 

[[email protected] ~]$ 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,通常建议收集如下信息:

[[email protected] ~]$ 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