我们有时候会遇到这种情况 :
已经显示kill掉了,但是会话还在,还是占用资源,这个时候我们想在操作系统上进行kill,可以通过
alter system kill session '2067,39031'; 执行之后出现如下情况:
SQL> select status,PADDR from v$session where sid ='2067';
STATUS PADDR
-------- ----------------
KILLED 07000026D5333D28
SQL> select spid from v$process where ADDR = '07000026D5333D28';
SPID
------------
5308956
oracle@oss139db02$[/home/oracle]ps -ef|grep 5308956
oracle 5308956 1 0 14:06:00 - 0:47 oracleoss1392 (LOCAL=NO)
oracle 16253808 12321576 0 16:58:45 pts/0 0:00 grep 5308956
oracle@oss139db02$[/home/oracle]kill -9 5308956
这个时候是比较好kill的,可以找到spid,如果无法找到spid,
就是有另外一种情况:
就是
select spid from v$process where ADDR = '07000026D5333D28'; ---这个时候的查询结果为空,
但是查询v$session的时候sid还在:
这个时候怎么找出被kill掉的session呢?
SELECT spid
FROM v$process
WHERE NOT EXISTS ( SELECT 1
FROM v$session
WHERE paddr = addr);
这个时候有可能有多个, 那哪个才是我们那个要kill的session呢?
我一般的判断方法是: 通过时间比对
SQL> select to_char(logon_time,'yyyy-mm-dd hh24:mi:ss'), spid from v$session s,v$process p where s.PADDR = p.ADDR and sid ='1720';
TO_CHAR(LOGON_TIME, SPID
------------------- ------------
2012-12-11 09:10:09 18220014
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
oracle@oss139db02$[/home/oracle]ps -ef |grep 18220014
oracle 13238556 12321576 0 17:07:24 pts/0 0:00 grep 18220014
oracle 18220014 1 0 09:10:09 - 0:00 oracleoss1392 (LOCAL=NO)
oracle@oss139db02$[/home/oracle]
这两个时间是一致的,通过这个时间可以得出自己要的session,我上面的例子是可以找出进程的情况,如果无法找出的话,可以看他的登录时间,是否与v$session一致即可。