半瓶内容

 results 1 - 1 of about 1 for 客户端异常退出导致的僵死进程. (0.357 seconds) 

客户端异常退出导致的僵死进程

今天在数据库的v$locked_object视图 里发现一个923号session,用户是SYS,一直持有对 PLAN_TABLE表的锁不释放,PLAN_TABLE是存储SQL执行计划的,很奇怪。

select sid,serial#,paddr,username,server,schemaname,osuser,terminal,program from v$session where sid=923

SID    SERIAL#    PADDR    USERNAME    SERVER    SCHEMANAME    OSUSER    TERMINAL    PROGRAM
923    42779    0700000C8F3D9588    SYS    PSEUDO    SYS    oracle    pts/2    sqlplus@p5b1 (TNS V1-V3)

查看进程信息:

select * from v$process where addr='0700000C8F3D9588'

发现spid的值为234178,这个也就是操作系统的进程id:

DB2@/ora_arch>ps -ef|grep 234178
oracle 413964 807630   0 15:00:19  pts/1  0:00 grep 234178
oracle 234178 623538   0   May 04      -  0:39 oraclebanpingdb2 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

通过检查一些操作日志发现5月4号,青年节这天确实有人登录执行过一个SQL:

SQL> create or replace procedure show_space(...

然后异常退出了,那么可以断定就是这个session一直僵死在这里了。

这时在数据库端杀session:

alter system kill session '923,42779'

从v$session看oracle只是把这个session标记为killed了,v$process虽然也查不到了,但是os层面的进程还在,杀之:

DB2@/ora_arch>kill -9 234178

然后再看,这个session已经被清理掉消失了:

select * from v$session where status='KILLED'

这种进程在oracle实例关闭的时侯会在alert日志里记录:

Process OS id : 271052 alive after kill
Errors in file /u01/admin/banpingdb/udump/banpingdb1_ora_865116.trc


Leave a Comment