在windows杀oracle线程的问题

http://www.itpub.net/showthread.php?threadid=864080&pagenumber=
今天遇到一个死锁问题,在windows下,杀异常线程使用:

ALTER SYSTEM KILL SESSION 'sid,serial#';

我发现kill后,查询:
select * from v$session where sid=28

STATUS='KILLED' , 什么那时候才消失.难道以后删除线程,要使用
orakill sid thread比较好.不过现在执行:

SELECT s.username, s.osuser, s.sid, s.serial#, p.spid
FROM v$session s, v$process p
WHERE s.paddr = p.addr
AND s.username is not null
AND sid = 28
是无法获得结果的.

google后,找到eygle写的文章,里面很好的描述了如何解决这个问题.
http://www.eygle.com/faq/Kill_Session.htm

主要是由于查询spid,在操作系统级来kill这些进程.但是由于此时v$session.paddr已经改变,
我们无法通过v$session和v$process关联来获得spid.

记录一下需要执行的sql语句:
SELECT s.username, s.status, x.ADDR, x.KSLLAPSC, x.KSLLAPSN, x.KSLLASPO, x.KSLLID1R, x.KSLLRTYP, decode(bitand (x.ksuprflg, 2), 0, null, 1)
FROM x$ksupr x, v$session s
WHERE s.paddr(+) = x.addr
AND bitand(ksspaflg, 1) != 0;

简单一点:
SELECT p.addr
FROM v$process p
WHERE pid 1 minus
SELECT s.paddr
FROM v$session s;

SELECT *
FROM v$process
WHERE addr IN (SELECT p.addr
FROM v$process p
WHERE pid 1
MINUS
SELECT s.paddr
FROM v$session s);

SELECT s.username, s.osuser, s.SID, s.serial#, p.spid
FROM v$session s, v$process p
WHERE s.paddr = p.addr AND s.username IS NOT NULL

然后使用orakill 来删除线程.


上一篇:C#关于MSMQ通过HTTP远程发送专有队列消息的问题


下一篇:Package gp in the OpenCASCADE