Oracle 彻底 kill session(一)

2014-11-24 17:54:50 · 作者: · 浏览: 0

通常情况下,并不需要从操作系统级别杀掉Oracle会话进程,但并非总是如此,下面的描述中给出了在Oracle级别杀掉会话以及操作系统级别杀掉进程。

一、获得需要kill session的信息(使用V$SESSION 和 GV$SESSION视图)


SET LINESIZE 180

COLUMN spid FORMAT A10

COLUMN username FORMAT A10

COLUMN program FORMAT A40


SELECT s.inst_id,

s.sid,

s.serial#,

p.spid,

s.username,

s.program,

s.paddr,

s.STATUS

FROM gv$session s

JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id

WHERE s.type != 'BACKGROUND';


INST_ID SID SERIAL# SPID USERNAME PROGRAM PADDR STATUS

---------- ---------- ---------- ---------- ---------- --------------------------------------------- -------- --------

1 146 23 27573 TEST sqlplus@oracle10g (TNS V1-V3) 4C621950 INACTIVE

1 160 17 27610 SYS sqlplus@oracle10g (TNS V1-V3) 4C624174 ACTIVE

1 144 42 27641 SCOTT sqlplus@oracle10g (TNS V1-V3) 4C624730 INACTIVE


二、使用ALTER SYSTEM KILL SESSION 命令实现

语法:

SQL> ALTER SYSTEM KILL SESSION 'sid,serial#';

SQL> ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;


对于RAC环境下的kill session ,需要搞清楚需要kill 的session 位于哪个节点,可以查询GV$SESSION视图获得。

kill session 的时候仅仅是将会话杀掉。在有些时候,由于较大的事务或需要运行较长的SQL语句将导致需要kill的session并不能立即杀掉。对于这种情

况将收到 "marked for kill"提示(如下),一旦会话当前事务或操作完成,该会话被立即杀掉。


alter system kill session '4730,39171'

*

ERROR at line 1:

ORA-00031: session marked for kill





在下面的操作中将杀掉会话146,144

sys@AUSTIN> alter system kill session '146,23';


System altered.


sys@AUSTIN> alter system kill session '144,42';


System altered.


sys@AUSTIN> select inst_id,saddr,sid,serial#,paddr,username,status,program from gv$session where username is not null;


INST_ID SADDR SID SERIAL# PADDR USERNAME STATUS PROGRAM

---------- -------- ---------- ---------- -------- ---------- -------- ---------------------------------------------

1 4C70BF04 144 42 4C6545A0 SCOTT KILLED sqlplus@oracle10g (TNS V1-V3)

1 4C70E6B4 146 23 4C6545A0 TEST KILLED sqlplus@oracle10g (TNS V1-V3)

1 4C71FC84 160 17 4C624174 SYS ACTIVE sqlplus@oracle10g (TNS V1-V3)


注意:在查询中可以看到被杀掉的会话的PADDR地址发生了变化,参照查询结果中的红色字体。如果多个session被kill 掉,则多个session的PADDR

被改为相同的进程地址。



通过下面的语句来找回被kill 掉的ADDR先前的地址

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;



USERNAME STATUS ADDR KSLLAPSC KSLLAPSN KSLLASPO KSLLID1R KS D

---------- -------- -------- ---------- ---------- ------------ ---------- -- -

ACTIVE 4C623BB8 99 4 27468 275 EV 1

ACTIVE 4C623040 9 24 27444 0 1

ACTIVE 4C622A84 101 4 27480 274 EV 1

ACTIVE 4C6224C8 1 48 27450 0 1

ACTIVE 4C621F0C 1 48 27450 0 1

ACTIVE 4C6235FC 2 4 27468 0 1

SYS ACTIVE 4C624174 2 15 27442 0

ACTIVE 4C62081C 1 48 27440 0 1

ACTIVE 4C621394 1 48 27440 0 1

ACTIVE 4C620DD8 11 24 27476