数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle数据库中Kill session的研究


发布日期:2024年04月30日
 
Oracle数据库中Kill session的研究

我们知道在Oracle数据库中可以通过kill session的方式来终止一个进程其基本语法结构为:

alter system kill session sidserial# ;

被kill掉的session状态会被标记为killedOracle会在该用户下一次touch时清除该进程

我们发现当一个session被kill掉以后该session的paddr被修改如果有多个session被kill那么多个session的paddr都被更改为相同的进程地址:

SQL> select saddrsidserial#paddrusernamestatus from v$session where username is not null;

SADDR SIDSERIAL# PADDRUSERNAME STATUS

EEC BE EYGLEINACTIVE

E BD SYSACTIVE

SQL> alter system kill session ;

System altered

SQL> select saddrsidserial#paddrusernamestatus from v$session where username is not null;

SADDR SIDSERIAL# PADDRUSERNAME STATUS

EEC DBD EYGLEKILLED

E BD SYSACTIVE

SQL> select saddrsidserial#paddrusernamestatus from v$session where username is not null;

SADDR SIDSERIAL# PADDRUSERNAME STATUS

EEC DBD EYGLEKILLED

EAA B EQSP INACTIVE

E BD SYSACTIVE

SQL> alter system kill session ;

System altered

SQL> select saddrsidserial#paddrusernamestatus from v$session where username is not null;

SADDR SIDSERIAL# PADDRUSERNAME STATUS

EEC DBD EYGLEKILLED

EAA DBD EQSP KILLED

E BD SYSACTIVE

在这种情况下很多时候资源是无法释放的我们需要查询spid在操作系统级来kill这些进程

但是由于此时v$sessionpaddr已经改变我们无法通过v$session和v$process关联来获得spid

那还可以怎么办呢?

我们来看一下下面的查询:

SQL> SELECT susernamesstatus

xADDRxKSLLAPSCxKSLLAPSNxKSLLASPOxKSLLIDRxKSLLRTYP

decode(bitand (xksuprflg)null)

FROM x$ksupr xv$session s

WHERE spaddr(+)=xaddr

and bitand(ksspaflg)!=;

USERNAME STATUS ADDR KSLLAPSC KSLLAPSN KSLLASPO KSLLIDR KS D

BA

ACTIVE B

ACTIVE BC

ACTIVE BFB

ACTIVE B

ACTIVE B

ACTIVE BAC

ACTIVE BE

ACTIVE B

ACTIVE BD

ACTIVE B

USERNAME STATUS ADDR KSLLAPSC KSLLAPSN KSLLASPO KSLLIDR KS D

SYSACTIVE BD

BE EV

B EV

SYSINACTIVE B

SYSINACTIVE BBF EV

rows selected

简化一点其实就是如下概念:

SQL> select paddr from v$process p where pid < > minus select spaddr from v$session s;

ADDR

BE

B

现在我们获得了进程地址就可以在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这被作为一次异常中断处理

上一篇:Oracle数据库的灾难恢复

下一篇:ORACLE 应用经验(4)-加密程序