oracle session status killed,进程状态为KILLED的进程如何杀掉

浅浅的花香味﹌ 2023-01-18 15:26 385阅读 0赞

有时候,我们在数据库中可能会出现数据库session被杀掉了,但是session状态还是killed,却不会被数据库回收.

如下面的状态:

SQL> select sid,serial#,status,server,terminal from v$session where status=’KILLED’;

SID SERIAL# STATUS SERVER TERMINAL LOGON_TIME

-————- ————— ———————— ————————— ——————————————— ——————————-

37 84 KILLED PSEUDO pts/tb 2010-11-19 15:02:56

81 102 KILLED PSEUDO pts/ta 2010-11-19 15:01:00

SQL>

对于这种情况,我们先不讨论是由于什么原因造成的,我们首先考虑该怎样把它从v$session表中去掉,也就是如何把他们杀掉?

(1)比较进程号

从数据库中取session中对应的进程号列表1

select spid from v$process where addr in (select paddr from v$session);

再从系统中取得该数据库启动的进程号列表2

ps -fu oracle|grep ORASID|grep -v grep|awk ‘{print $2}‘

取得两个列表1和2,可以肯定,从操作系统中取得的进程列表2是比从数据库中取得的进程列表1是多的.

将列表2 减 列表1得出多出的进程为

20624,20626,5052,5517,20630,20628

登陆系统查询

hostname:/> ps -fu oracle|egrep -E “20624|20626|5052|5517|20630|20628”|grep -v egrep

oracle 20624 1 10 23:22:16 ? 0:11 ora_p000_ORASID

oracle 20626 1 10 23:22:16 ? 0:09 ora_p001_ORASID

oracle 5052 5005 0 15:01:00 ? 0:13 oracleORASID (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

oracle 5517 5510 0 15:02:56 ? 0:00 oracleORASID (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

oracle 20630 1 11 23:22:16 ? 0:09 ora_p003_ORASID

oracle 20628 1 11 23:22:16 ? 0:10 ora_p002_ORASID

对比进程的创建时间,和session的logon_time相符。而且其他进程都是并行进程,因此可以判断这两个被kill掉的session的系统进程号为5052,5517.

将这两个进程杀掉后等一小会儿,session消失

正常情况下,如果session被杀掉后,过一段时间数据库会自动回收这些session,有时候这个回收过程会持续很长[@more@]

发表评论

表情:
评论列表 (有 0 条评论,385人围观)

还没有评论,来说两句吧...

相关阅读

    相关 进程kill怎么办

    问题背景:公司内部的一套发布系统,每次部署,启动git仓库所指代码,并且启动时不是直接通过java -jar 启动的,是属于发布系统内的子进程,当子进程在调用exit命令结束自