精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● 认证工程师>>Microsoft 认证>>精彩文章>>技术杂谈>>应用服务>>[转载]如何通过sql语句kill一个session

主题:[转载]如何通过sql语句kill一个session
发信人: reynolds(闪电雷龙)
整理人: reynolds(2001-11-19 10:02:03), 站内信件
1、通常kill session是由DBA手动处理的,要非常谨慎  
2、BACKGROUD sessions不能kill,否则会引起不可预知的错误  
3、ACTIVE sessions不能kill  
4、即使session是inactive的,也不表示就可以随便kill  

SQL> select sid,serial#, username, status, type  
  2  FROM v$session;  

      SID    SERIAL# USERNAME                      STATUS  TYPE  
---------- ---------- ------------------------------ -------- ----------  
        1          1                                ACTIVE  BACKGROUND  
        2          1                                ACTIVE  BACKGROUND  
        3          1                                ACTIVE  BACKGROUND  
        4          1                                ACTIVE  BACKGROUND  
        5          1                                ACTIVE  BACKGROUND  
        6          1                                ACTIVE  BACKGROUND  
        7        21 KNUT                          INACTIVE USER  
        8        33 SYSTEM                        ACTIVE  USER  

8 rows selected.  

如果你一定要的话,可以试试这样(kill 所有inactive sessions,太霸道了吧!):  
SQL> connect system/manager  
Connected.  
SQL> select sid,serial#, username, status, type  
  2  from v$session;  

      SID    SERIAL# USERNAME                      STATUS  TYPE  
---------- ---------- ------------------------------ -------- ----------  
        1          1                                ACTIVE  BACKGROUND  
        2          1                                ACTIVE  BACKGROUND  
        3          1                                ACTIVE  BACKGROUND  
        4          1                                ACTIVE  BACKGROUND  
        5          1                                ACTIVE  BACKGROUND  
        6          1                                ACTIVE  BACKGROUND  
        7        26 KNUT                          INACTIVE USER  
        8        35 SYSTEM                        ACTIVE  USER  
        9        19 WMS                            INACTIVE USER  

9 rows selected.  

SQL> declare  
  2    cursor cur_sess is  
  3      select sid, serial#  
  4        from v$session  
  5        where status = 'INACTIVE'  
  6          and type  != 'BACKGROUD';  
  7    w_sid number;  
  8    w_serial number;  
  9  begin  
10    open cur_sess;  
11    loop  
12      fetch cur_sess into w_sid,w_serial;  
13      if cur_sess%notfound then  
14        exit;  
15      end if;  
16      execute immediate 'alter system kill session '''¦¦w_sid¦¦','¦¦w_serial¦¦'''';  
17    end loop;  
18  end;  
19  /  

PL/SQL procedure successfully completed.  

SQL> select sid,serial#, username, status, type  
  2  from v$session;  

      SID    SERIAL# USERNAME                      STATUS  TYPE  
---------- ---------- ------------------------------ -------- ----------  
        1          1                                ACTIVE  BACKGROUND  
        2          1                                ACTIVE  BACKGROUND  
        3          1                                ACTIVE  BACKGROUND  
        4          1                                ACTIVE  BACKGROUND  
        5          1                                ACTIVE  BACKGROUND  
        6          1                                ACTIVE  BACKGROUND  
        7        26 KNUT                          KILLED  USER  
        8        35 SYSTEM                        ACTIVE  USER  
        9        19 WMS                            KILLED  USER  

9 rows selected. 


----
         /
    <>< o /| /
   <>< (o / |/|
    ) ) <@ <
   ( O )( \ |\| <><
  ) <>< () \| \
         \

   天在     

[关闭][返回]