如何杀死仅处于非活动状态的Oracle DB会话?

时间:2018-11-14 21:52:22

标签: database oracle session

我需要终止(kill)Oracle Db v$sessionstatus无效的所有会话
为了列出活动和不活动的会话,我使用了以下语句:

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

我需要一个声明来终止状态为==活跃的会话

2 个答案:

答案 0 :(得分: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$sessiongv$session动态性能视图替换,并且INST_ID列与具有RAC DB情况的实例编号参数进行排序。即,即使您具有单个实例数据库,也可以使用上述代码。

答案 1 :(得分:1)

只有一种终止会话的方法,即通过Cursor cursor = null; try { cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME + " LIMIT 1", null); ... } finally { if(cursor != null) { cursor.close(); } }
例如,这是一个声明:

'sid,serial#'

因此,我们需要经历一个周期才能对所有ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE; 执行此语句,但仅当 status!= active 时: 这段代码可以解决这个问题:

'sid,serial#'