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. ;-)