Как убить все активные и неактивные сеансы oracle для пользователя

Я пытаюсь ниже сценарий, чтобы убить все активные и неактивные сеансы oracle для пользователя сразу, но он не работает. Сценарий выполняется успешно, но не убивает сеансы для пользователя.

BEGIN
  FOR r IN (select sid,serial# from v$session where username = 'USER')
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid 
      || ',' || r.serial# || '''';
  END LOOP;
END;

3 ответов


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

проверяем статус подтвердите:

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

вы также можете использовать немедленно статья:

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

на IMMEDIATE предложение не влияет на работу, выполняемую командой, но оно возвращает управление обратно в текущий сеанс немедленно, а не ждет подтверждения убийства. Взгляните на Убийство Сеансов Oracle.

обновление если вы хотите убить все сеансы, вы можете просто подготовить небольшой скрипт.

SELECT 'ALTER SYSTEM KILL SESSION '||sid||','||serial#||';' FROM v$session;

шпульки как .sql файл и выполнить его.


BEGIN
  FOR r IN (select sid,serial# from v$session where username='user')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid  || ',' 
        || r.serial# || ''' immediate';
  END LOOP;
END;

это должно работать - я просто изменил ваш скрипт, чтобы добавить immediate ключевое слово. Как указывалось в предыдущих ответах,kill session только отмечает сеансы для убийства; он делает это не сразу, но позже, когда это удобно.

из вашего вопроса, казалось, вы ожидаете увидеть результат немедленно. Так что .


выполнить этот скрипт:

SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' 
FROM v$session 
where username='YOUR_USER';

он будет распечатывать sqls, которые должны быть выполнены.