Вот как определить сеанс для уничтожения (для его уничтожения понадобятся SID и SERIAL #). Должен ли я упомянуть, что вам нужно убедиться, что вы убиваете правильный сеанс? sys_context('userenv','sid')
получает SID вашего собственного сеанса.
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.osuser,
s.program
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND';
После этого вы можете выдать alter system kill session '[sid],[serial#]'
, как предлагает WW.
Однако команда alter system kill session
не приводит к принудительному завершению сеанса, скорее, она просит сеанс умереть. Если сеанс действительно завис, вы обнаружите, что запрос зависает на 60 секунд, а затем возвращает ORA-00031 Session marked for kill
. И сессия все еще там.
В этом случае сначала убедитесь, что сеанс не откатывает большую транзакцию (перекрестная ссылка на SID и SERIAL # из приведенного выше):
SELECT s.username,
s.osuser,
s.sid,
s.serial#,
t.used_ublk,
t.used_urec,
rs.segment_name,
r.rssize,
r.status
FROM v$transaction t,
v$session s,
v$rollstat r,
dba_rollback_segs rs
WHERE s.saddr = t.ses_addr
AND t.xidusn = r.usn
AND rs.segment_id = t.xidusn
ORDER BY t.used_ublk DESC;
Если транзакция откатывается, вы увидите, что USED_UREC уменьшается. Оставьте его для завершения отката.
В противном случае ALTER SYSTEM DISCONNECT SESSION '[sid],[serial#]' IMMEDIATE;
принудительно отключит сеанс и откатит открытую транзакцию.
Вся вышеупомянутая информация взята с здесь .