Oracle 彻底 kill session

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     

相关推荐