数据库hang住分析处理

来源:这里教程网 时间:2026-03-03 19:45:29 作者:

方式一、做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 看下是不是系统进程

相关推荐