Nie można wylogować się z bazy danych Oracle bez popełnienia lub wycofania. Możliwe, że aplikacja kliencka uległa awarii lub została przymusowo zakończona i nie miała szansy na wylogowanie, pozostawiając sesję na serwerze, który trzyma pewne blokady. W takim przypadku DBA musiałaby zabić tę sesję.
Jeśli jesteś DBA i nie jesteś pewien, co sesja musi być zabity, można uruchomić następujące zapytanie aby uzyskać informacje na temat różnych sesjach, które są posiadających zamki, które blokują inne sesje
SELECT ses.sid, ses.serial#, ses.username, ses.program, ses.osuser, ses.machine
FROM v$session ses,
dba_blockers blk
WHERE blk.holding_session = ses.sid
Po zidentyfikowaniu, która sesja (y), aby zabić
ALTER SYSTEM KILL SESSION '<<sid>>, <<serial#>>'
Dzięki @JustinCave za odpowiedź. Aby wyjaśnić, czy sesja nie zostanie wyraźnie zakończona, nigdy nie zakończy się automatycznie? –
@RussellSilva - To zależy, co masz na myśli przez "automatyczne". Jeśli aplikacja kliencka ulegnie awarii, można włączyć wykrywanie niedziałającego połączenia (DCD) na serwerze bazy danych. To spowoduje, że baza danych będzie okresowo wysyłała polecenia ping do klienta, aby ustalić, czy nadal działa i czy zabić sesję, jeśli klient się zawiesił. Dzieje się to jednak stosunkowo szybko, więc nie było to związane z pierwotnym pytaniem. Możesz skonfigurować Oracle, aby zabijał sesje, jeśli są one zbyt długo nieaktywne. W każdym z tych przypadków sesja jest jawnie zakończona przez "rollback", jest po prostu zakończona przez bazę danych. –