SQL скрипт для прерывания сессий

Last modified by Александр Таболин on 2023/07/24 18:25

В общем случае, убивать зависшие сессии Oracle может быть необходимо для освобождения ресурсов, предотвращения блокировок, устранения ошибок или повышения производительности. Однако, убивать сессии также может иметь негативные последствия, такие как потеря данных, долгий откат транзакций, нарушение целостности или нестабильность системы. Поэтому, перед тем как убивать сессии Oracle, важно понимать причины их зависания, анализировать их состояние и влияние на базу данных, а также выбирать подходящий метод их отмены. 

set serveroutput on

declare
  fCnt int := 0;
begin
  for cKill in
  ( select 'alter system disconnect session '''||sid||','||serial#||''' immediate' as s
      from v$session
      where status = 'ACTIVE'
        and seconds_in_wait>2*24*60*60
        and event in ('single-task message', 'SQL*Net message from dblink', 'SQL*Net more data from dblink')
      order by audsid
  ) loop
    dbms_output.put_line(cKill.s||' ...');
    begin
      execute immediate cKill.s;
      fCnt := fCnt + 1;
    exception
      when others then
        dbms_output.put_line(sqlerrm);
    end;
  end loop;
  dbms_output.put_line('Killed '||fCnt);
end;
/

Скачать файл SQL