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

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

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;

Ответ 1

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

Проверьте статус, чтобы подтвердить:

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

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

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

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

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

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

Подпишите вышеприведенное в файл .sql и выполните его.

Ответ 2

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;

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

Из вашего вопроса, похоже, вы ожидаете увидеть результат немедленно. Поэтому для этого используется ключевое слово immediate.

Ответ 3

Выполните этот script:

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

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

Ответ 4

Для Oracle 11g это может не работать, так как вы можете получить сообщение об ошибке, как показано ниже

Error report:
SQL Error: ORA-00026: missing or invalid session ID
00026. 00000 -  "missing or invalid session ID"
*Cause:    Missing or invalid session ID string for ALTER SYSTEM KILL SESSION.
*Action:   Retry with a valid session ID.

Чтобы исправить это, используйте приведенный ниже код для идентификации сессий

SQL> select inst_id,sid,serial# from gv$session или v $ session

ПРИМЕЧАНИЕ: v $ session не имеет поля inst_id

и убить их, используя

alter system kill session 'sid,serial,@inst_id' IMMEDIATE;

Ответ 5

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;
/

Меня устраивает.

Ответ 6

неактивный сеанс за день до убийства

begin
    for i in (select * from v$session where status='INACTIVE' and (sysdate-PREV_EXEC_START)>1)
    LOOP
        EXECUTE IMMEDIATE(q'{ALTER SYSTEM KILL SESSION '}'||i.sid||q'[,]'  ||i.serial#||q'[']'||' IMMEDIATE');
    END LOOP;
end;