您的位置:首页 > 数据库 > Oracle

Oracle 彻底 kill session

2016-05-25 14:18 573 查看
转自:http://blog.csdn.net/leshami/article/details/6439019

--***************************
-- 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                   
 
三、在操作系统级别杀掉会话
  寻找会话对应的操作系统的进程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。
            
六、有关kill session的参考:
  Oracle How To:如何快速杀死占用过多资源(CPU,内存)的数据库进程   
  Oracle中Kill session的研究
  Killing Oracle Sessions
 
七、更多参考:
 
有关性能优化请参考
Oracle 硬解析与软解析
共享池的调整与优化(Shared pool Tuning)
Buffer cache 的调整与优化(一)
Oracle 表缓存(caching table)的使用
 
有关闪回特性请参考
Oracle 闪回特性(FLASHBACK DATABASE)
Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)
Oracle 闪回特性(Flashback Query、Flashback Table)
Oracle 闪回特性(Flashback Version、Flashback Transaction)
 
有关基于用户管理的备份和备份恢复的概念请参考
Oracle 冷备份
Oracle 热备份
Oracle 备份恢复概念
Oracle 实例恢复
Oracle 基于用户管理恢复的处理(详细描述了介质恢复及其处理)
 
有关RMAN的恢复与管理请参考
RMAN 概述及其体系结构
RMAN 配置、监控与管理
RMAN 备份详解
RMAN 还原与恢复
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: