Как убить все активные и неактивные сеансы оракула для пользователя
Я пытаюсь использовать ниже 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;