数据库hang住分析处理

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

上一篇:C++生成动态连接库


下一篇:Milvus 向量数据库介绍及使用