image

编辑人: 舍溪插画

calendar2025-04-14

message1

visits112

Oracle如何中断正在执行的 session连接?

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’

bkill操作系统上进程,在 oracle用户下执行如下命令:

 

kill -9


进程号

 

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:Oracle如何中断正在执行的 session连接?

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share