在windows殺oracle執行緒的問題

lfree發表於2007-09-30

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寫的文章,裡面很好的描述瞭如何解決這個問題.

主要是由於查詢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 來刪除執行緒.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-83095/,如需轉載,請註明出處,否則將追究法律責任。

相關文章