Obwohl Oracle ein sehr stabiles System ist, hatte ich immer wieder mit Deadlocks zu kämpfen. Deswegen hier das Rezept zum finden und lösen.
Anmelden an SQLPlus:
sqlplusw sys/[IhrSYSPasswort@[IHREDatenbankinstanz] as sysdba
in SQLplus:
SELECT sid, serial#, osuser, machine, program, status, logon_time, client_info
FROM v$session
WHERE sid IN (SELECT sid FROM v$lock WHERE block=1);
Dann
Mit dem Ergebnis von SID und serial# aus dem ersten Query
ALTER SYSTEM KILL SESSION 'SID,SERIAL#';
Mehr über gesperrte Objekte erfahren
Zusätzliche Informationen über gesperrte Datenbankobjekte erhalten Sie mit folgender Abfrage:
SELECT * FROM all_objects >WHERE object_id in (SELECT object_id FROM v$locked_object WHERE session_id in (SELECT sid FROM v$lock WHERE block=1));
... und noch etwas formatierter
Auf einen Blick (siehe Spalte blocking_others):
set linesize 2000
col Betriebsystemuser format a20 word
col Objekt format a20 word
select
lo.session_id, s.serial#, lo.os_user_name as Betriebsystemuser, s.terminal, s.program,
o.object_name as Objekt, l.block as blocking_others, l.request, l.TYPE, l.ctime as time_in_sec
from
v$locked_object lo, all_objects o, v$session s, v$lock l
where
lo.object_id = o.object_id
and lo.session_id = s.sid
and lo.session_id = l.sid
order by
lo.session_id;
Wenn es nötig ist, die Datenbanksperre aufzuheben, kann die Datenbank-Session, welche die Sperre verursacht, datenbankseitig beendet werden. Dazu ist folgendes Statement zu verwenden, wobei man <SID> und <SERIAL#> aus der Tabelle v$session (siehe die weiter oben genannte Abfrage) bezieht. Beachten Sie, dass bei falscher Anwendung Datenverlust entstehen kann.
alter system kill session '<SID>,<SERIAL#>';
beispielsweise:
alter system kill session '17,14362';
Dabei ist zu beachten, dass die Anwendung, welche über diese Verbindung auf die Datenbank zugreift, den Zugriff auf die Datenbank verliert und dies möglicherweise mit eine Fehlermeldung zum Ausdruck bringt. ;-)