教学文章
Technology Exchange
热门课程
400电话

免费咨询热线
400-090-9964

教学文章

Oracle 彻底 kill session

时间:2017-07-25 来源:

  kill session 是DBA经常碰到的事情之一。如果kill 掉了不该kill 的session,则具有破坏性,因此尽可能的避免这样的错误发生。同时也应当注意,

  如果kill 的session属于Oracle 后台进程,则容易导致数据库实例宕机。

  通常情况下,并不需要从操作系统级别杀掉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 0 1

  ACTIVE 4C61F6E8 15 4 27610 0 1

  ACTIVE 4C620260 222 24 27450 0 1

  ACTIVE 4C61FCA4 7 25 27573 0 1

  ACTIVE 4C61F12C 6 25 27573 0 1

  ACTIVE 4C61EB70 4 24 27458 0 1

  ACTIVE 4C61E5B4 1 48 27440 0 1

  ACTIVE 4C61DFF8 2 24 27444 0 1

  4C624730 0 0 0

  4C621950 0 0 0

  4C61DA3C 0 0 0

  或者根据下面的语句来获得发生变化的addr

  sys@AUSTIN> select p.addr from v$process p where pid <> 1

  2 minus

  3 select s.paddr from v$session s;

  ADDR

  --------

  4C621950

  4C624730

  三、在操作系统级别杀掉会话

  寻找会话对应的操作系统的进程ID

  sys@AUSTIN> select SPID from v$process where ADDR in ('4C621950','4C624730') ;

  SPID

  ----------

  27573

  27641

  使用kill 命令来杀掉操作系统级别进程ID

  kill session -9 27573

  kill session -9 27641

  四、获得当前会话的SID

  SQL> select userenv('sid') from dual;

  USERENV('SID')

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

  627

  五、多个会话需要kill 的处理办法

  1.根据给定的SID(用户名)查找需要杀掉会话的信息,包括位于哪一个实例

  set linesize 160

  col program format a35

  col username format a18

  select inst_id,saddr,sid,serial#,paddr,username,status,program from gv$session

  where sid in ('2731','2734','2720','2678','2685')

  and username='CTICUST'

  order by inst_id;

  INST_ID SADDR SID SERIAL# PADDR USERNAME STATUS PROGRAM

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

  1 00000003DAF8F870 2678 8265 00000003DBC6CA08 MSS4USR INACTIVE JDBC Thin Client

  1 00000003DAF98E48 2685 83 00000003DBC08510 MSS4USR ACTIVE JDBC Thin Client

  1 00000003DAFC7B80 2720 5 00000003DBBEDA20 MSS4USR INACTIVE JDBC Thin Client

  1 00000003DAFD66F8 2731 3 00000003DBBE9AE0 SYS ACTIVE racgimon@svdg0028(TNS V1-V3)

  1 00000003DAFDA730 2734 15 00000003DBBEC268 MSS4USR INACTIVE JDBC Thin Client

  2 00000003DAFD66F8 2731 1 00000003DBBE92F8 ACTIVE oracle@svdg0029 (ARC0)

  上面的查询中有一个SID为2731的位于节点2上。

  也可以通过下面的方式来获得RAC的节点信息,便于确定需要kill 的session究竟位于哪一个节点。

  set linesize 160

  col HOST_NAME format a25

  SQL> select INSTANCE_NUMBER,INSTANCE_NAME,HOST_NAME,VERSION,STATUS from gv$instance order by 1;

  INSTANCE_NUMBER INSTANCE_NAME HOST_NAME VERSION STATUS

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

  1 O02WMT1A svd0051 10.2.0.4.0 OPEN

  2 O02WMT1B svd0052 10.2.0.4.0 OPEN

  3 O02WMT1C svd0053 10.2.0.4.0 OPEN

  2.使用下面查询来生成kill session 的语句

  select 'alter system kill session '''|| sid ||',' ||SERIAL# ||''''||';' from gv$session

  where sid in ('2731','2734','2720','2678','2685')

  order by inst_id;

  获得下列kill session的语句,根据要求由于此次需要杀掉的session全部位于节点1,因此登录到节点节点1执行下面的语句

  alter system kill session '2678,8265';

  alter system kill session '2685,83';

  alter system kill session '2720,5';

  alter system kill session '2731,3';

  alter system kill session '2734,15';

  alter system kill session '2731,1'; --此条命令不需要执行,该session位于节点2。

  (以上内容摘于网络,如有侵权,请告之,将第一时间删除)

版权所有@北京神脑资讯技术有限公司(CUUG,中国UNIX用户协会) Copyright ALL Rights Reserved 京ICP备11008061号-1

CUUG旗下网站:www.cuug.com.cn www.cuug.com oracle.cuug.com bbs.cuug.com www.cuug.net

电话:010-59426307 010-59426319 邮政编码:100089

地址:北京市海淀区北清路164号28-38号院