由于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:
D:>orakill
Usage: orakill sid thread
where sid = the Oracle instance to target
thread = the thread id of the thread to kill
The thread id should be retrieved from the spid column of a query such as:
select spid, osuser, s.program from
v$process p, v$session s where p.addr=s.paddr
如果强行使用orakill杀了某个会话的线程,则该会话再执行操作则会换回ora-03113:
SYS@ning>select * from v$version;
select * from v$version
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
这和使用alter system kill是不一样的,alter system kill session后:
SYS@ning>select * from v$version;
select * from v$version
*
ERROR at line 1:
ORA-00028: your session has been killed
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/193161/viewspace-50326/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/193161/viewspace-50326/