ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 在windows杀oracle线程的问题

在windows杀oracle线程的问题

原创 Linux操作系统 作者:lfree 时间:2007-09-30 00:00:00 0 删除 编辑

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 来删除线程.


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-83095/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    2352
  • 访问量
    6094593