在Windows上使用orakill结束oracle会话的线程,由于oracle在Windows平台采用了单进程多线程的实现方式,unix/linux上的server process在windows上实际是一个thread。
我们知道,在unix平台上,有时使用alter system kill的方式杀死一个用户会话后,可能会标记为killed而不是立即释放该会话所占有的所有资源,
或者由于某些原因,某些会话处于假死状态,这时可能要在os级别强行kill对应的process。
但在windows上,进程管理器中只能看到一个oracle进程,而无法看到并且杀死具体的线程。
这种情况下,我们当然可以借助第三方的线程管理工具来实现我们杀某个指定线程的目的,但实际上,oracle本身也是提供了这种的工具的。这就是orakill工具。
orakill的用法很简单,两个参数,
第一个是oracle_sid,第二个是线程号,也就是oracle的v$process中的spid,请看下面实例。
1)查oracle所有会话进程线程信息
SET pagesize 100
SET linesize 100
COLUMN Program format a20
SELECT s.sid AS “Sid”, s.serial# AS “Serial#”, p.spid AS “ThreadID”,s.osuser AS “OSUser”, s.program AS “Program”
FROM v$process p, v$session s
WHERE p.addr = s.paddr(+)
ORDER BY s.sid;
2)查oracle系统会话进程线程信息
Select vb.name NAME, vp.program PROCESSNAME, vp.spid THREADID, vs.sid SID
From v$session vs, v$process vp, v$bgprocess vb
Where vb.paddr <> ’00’ and
vb.paddr = vp.addr and
vp.addr = vs.paddr;
3)查oracle非系统会话进程线程信息
SELECT s.sid AS “Sid”, s.serial# AS “Serial#”, p.spid AS “ThreadID”,s.osuser AS “OSUser”, s.program AS “Program”
FROM v$process p, v$session s
WHERE p.addr = s.paddr(+)
and s.sid not in (select vs.sid SID
From v$session vs, v$process vp, v$bgprocess vb
Where vb.paddr <> ’00’ and
vb.paddr = vp.addr and
vp.addr = vs.paddr)
ORDER BY s.sid;
4)使用orakill工具杀掉oracle非系统会话
SELECT ‘orakill tdb ‘||p.spid AS “ThreadID”
FROM v$process p, v$session s
WHERE p.addr = s.paddr(+)
and s.sid not in (select vs.sid SID
From v$session vs, v$process vp, v$bgprocess vb
Where vb.paddr <> ’00’ and
vb.paddr = vp.addr and
vp.addr = vs.paddr)
ORDER BY s.sid;
SQL> SELECT 'orakill tdb '||p.spid AS "ThreadID"
2 FROM v$process p, v$session s
3 WHERE p.addr = s.paddr(+)
4 and s.sid not in (select vs.sid SID
5 From v$session vs, v$process vp, v$bgprocess vb
6 Where vb.paddr <> '00' and
7 vb.paddr = vp.addr and
8 vp.addr = vs.paddr)
9 ORDER BY s.sid;
ThreadID
------------------------------------
orakill tdb 492
orakill tdb 2416
orakill tdb 1952
orakill tdb 360
orakill tdb 1204
orakill tdb 2656
orakill tdb 2244
orakill tdb 2020
orakill tdb 1512
orakill tdb 3948
orakill tdb 3744
orakill tdb 2192
orakill tdb 1612
orakill tdb 1240
orakill tdb 600
orakill tdb 1668
---其中tdb为数据库实例名
关于kill session的研究请参考eygle博客:http://www.eygle.com/faq/Kill_Session.htm