分享

进程状态为KILLED的进程如何杀掉

 姑苏慕容凡 2015-06-12

有时候,我们在数据库中可能会出现数据库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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多