【问题标题】:How To Kill Oracle DB Sessions Who are inActive Only?如何杀死仅处于非活动状态的 Oracle DB 会话?
【发布时间】:2018-11-14 21:52:21
【问题描述】:

我需要终止(杀死)Oracle Db v$session 中的所有会话,其中 status 未处于活动状态
要列出活动和非活动会话,我使用了以下语句:

SELECT sid, serial#, status FROM v$session;

我需要一个声明来终止 status != Active 的会话

【问题讨论】:

    标签: oracle session data-dictionary


    【解决方案1】:

    你可以使用下面的块

    declare
      v_command varchar2(500);
    begin
      for c in (
                select sid, serial#, machine, module, username, client_info, status, inst_id
                  from gv$session v
                 where v.status != 'ACTIVE'
                 --and v.inst_id = '&i_inst_id'
                  order by username
                ) 
      loop
       begin          
          v_command := 'alter system kill session ''' || c.sid || ',' ||c.serial# ||  
                       ',@'||to_char(c.inst_id)||''' immediate';   
         execute immediate v_command;
        exception when others then dbms_output.put_line(sqlerrm); 
       end; 
      end loop;
    end;
    

    其中v$session 替换为gv$session 动态性能视图,INST_ID 列排序规则与实例编号参数用于具有RAC DB 情况的情况。也就是说,即使你有一个单实例数据库,也可能会使用上面的代码。

    【讨论】:

      【解决方案2】:

      只有一种方法可以终止会话,那就是'sid,serial#'
      例如,这是一个声明:

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

      所以我们需要通过一个循环来为所有'sid,serial#' 执行此语句,但仅当 status!=active 时: 这段代码可以解决这个问题:

      BEGIN
        FOR sess IN (select sid,serial# from v$session where status<>'ACTIVE')
        LOOP
            EXECUTE IMMEDIATE 'alter system kill session ''' || sess.sid  || ',' 
              || sess.serial# || ''' immediate';
        END LOOP;
      END;
      

      【讨论】:

        猜你喜欢
        • 2014-11-13
        • 2019-07-16
        • 1970-01-01
        • 2015-03-03
        • 2018-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        相关资源
        最近更新 更多