在 Oracle数据库中,可以通过 kill session的方式来终止一个进程,语法结构如下:
alter system kill session ‘sid,serial#‘ ;
被 kill掉的 session,状态会被标记为 killed,Oracle会在该用户下一次 touch时清除该进程.当一
个 session被 kill掉以后,该 session的 paddr被修改,如果有多个 session被 kill,那么多个 session
的 paddr都被更改为相同的进程地址:
select
s.pid, s.addr, a.sid, a.serial#, a.program, a.status, a.username, a.machine,
a.command, a.sql_hash_value
from v$process s, v$session a
where s.addr = a.paddr and a.username is not null and a.username <> ‘SYS’
很多时候,status状态是 killed,这种情况下资源是无法释放的,要查询对应的 spid,在操作系统
级来 kill这些进程,但是由于此时 v$session.paddr已经改变,我们无法通过 v$session和 v$process
关联来获得 spid。这样,需要知道当前进程的 addr值,通过以下语句可以进行:注意,查询 x$ksupr
视图需要 sys用户才可以查看)
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 and s.username <> ‘SYS’;
通过以上语句,找到进程的 addr值,通过 addr值就可以在 v$process中找到 spid,然后可以
使用 Kill或者 orakill在系统级来杀掉这些进程。
当在 Oracle中 kill session以后, Oracle只是简单的把相关 session的 paddr指向同一个虚拟地
址.
此时 v$process和 v$session失去关联,进程就此中断。然后 Oracle就等待 PMON去清除这些 Session.
所以通常等待一个被标记为 Killed的 Session退出需要花费很长的时间.如果此时被 Kill的 process,
重新尝试执行任务,那么马上会收到进程中断的提示,process退出,此时 Oracle会立即启动 PMON
来清除该 session.这被作为一次异常中断处理:
a)查看进程号:
select s.pid, s.addr from v$process s where s.addr=’ADDR_VALUES’
b)kill操作系统上进程,在 oracle用户下执行如下命令:
kill -9
进程号