Как убить сеансы БД Oracle Кто неактивен только? - PullRequest
0 голосов
/ 15 ноября 2018

Мне нужно прекратить (убить) все сеансы внутри Oracle Db v$session, где status не является активным
Чтобы перечислить активные и неактивные сеансы, я использовал этот оператор:

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

Мне нужен оператор для завершения сеансов, где статус! = Активный

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Есть только один способ завершить сеанс, и это '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;
0 голосов
/ 15 ноября 2018

Вы можете использовать следующий блок

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 случаев. то есть, даже если у вас есть база данных с одним экземпляром, можно использовать и приведенный выше код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...