Hauptmenü öffnen

Lock-Erkennung und -BehebungBearbeiten

Locks auf der Datenbank ermittelnBearbeiten

Ausgeben aller Sessions, die gerade von anderen Sessions blockiert werden.

 select *
 from v$session
 where blocking_session is not null

Locks auf allen Objekten in der Datenbank anzeigen

 SELECT a.session_id, a.oracle_username, a.os_user_name, b.object_name
 FROM   v$locked_object a, sys.all_objects b
 WHERE  b.object_id = a.object_id
 ORDER BY 2, 3;

Locks nur für die Objekte des aktuellen Benutzers in der Datenbank anzeigen

 SELECT a.session_id, a.oracle_username, a.os_user_name, b.object_name
 FROM   v$locked_object a, sys.user_objects b
 WHERE  b.object_id = a.object_id
 ORDER BY 2, 3;

SQL-Statement-Cache der aktuellen Sessions anzeigen

 SELECT se.username, se.osuser, sq.sql_text
 FROM   v$sql sq, v$session se
 WHERE  se.sql_address = sq.address 
 ORDER BY 1, 2;

Skript catblock.sql zur Anzeigen von SperrungenBearbeiten

In $ORACLE_HOME\RDBMS\ADMIN\catblock.sql befindet sich ein Script zum Erstellen einiger System-Views, mit denen Locks angezeigt werden können. Folgende Views werden erstellt:

  • DBA_KGLLOCK
  • DBA_LOCKS
  • DBA_LOCK
  • DBA_LOCK_INTERNAL
  • DBA_DML_LOCKS
  • DBA_DDL_LOCKS
  • DBA_WAITERS
  • DBA_BLOCKERS

Blockiert jemand eine andere Transaktion?

 SQL> select * from dba_waiters
 ;
 WAITING_SESSION HOLDING_SESSION
 --------------- ---------------
              13              19

Wer wird blockiert?

 SQL> select * from dba_waiters
 ;
 WAITING_SESSION HOLDING_SESSION
 --------------- ---------------
              13              19

Wie lange wartet die Session 13 schon?

 SQL> select session_id, LAST_CONVERT Sekunden, LAST_CONVERT/60 Minuten 
 from dba_locks where Session_id in (13, 19)
 ;
 SESSION_ID   SEKUNDEN    MINUTEN
 ---------- ---------- ----------
         13       2011 33,5166667
         13       2011 33,5166667
         13       2011 33,5166667
         19       2057 34,2833333
         19       2057 34,2833333
         19       2061      34,35

Welche User arbeitet als Session 13 bzw. 19?

 SQL> select sid, serial#, username from v$session where sid in (13,19)
 ;
        SID    SERIAL# USERNAME
 ---------- ---------- ------------------------------
         13         71 SCOTT
         19         35 SCOTT

Skript utllockt.sql zur Anzeige von wartenden TransaktionenBearbeiten

In $ORACLE_HOME\RDBMS\ADMIN\utllockt.sql findet man ein Script zur Anzeige von wartenden Transaktionen.

In diesem Script wird

  • eine Tabelle erstellt,
  • mit Daten gefüllt,
  • angezeigt
  • und dann wird die Tabelle wieder entfernt.

Beispiel für eine Anzeige von Sperren:

  • Die Session 9 wartet auf die Session 8.
  • Session 7 wartet auf Session 9
  • Session 10 wartet ebenfalls auf Session 9
 WAITING_SESSION   TYPE MODE REQUESTED    MODE HELD         LOCK ID1 LOCK ID2
 ----------------- ---- ----------------- ----------------- -------- --------
 8                 NONE None              None              0         0
    9              TX   Share (S)         Exclusive (X)     65547     16
       7           RW   Exclusive (X)     S/Row-X (SSX)     33554440  2
       10          RW   Exclusive (X)     S/Row-X (SSX)     33554440  2

Kill SessionBearbeiten

Die Session 19 blockiert die Session 13 schon seit 34 Minuten. Sie soll beendet werden. Bei kill session muss man immer die Session-Id und die Serial-Nummer in Anführungszeichen angeben.

 SQL> alter system kill session '19, 35'
 ;
 System wurde geändert.

Die Session 19 erhält zunächst keine Fehlermeldung. Erst wenn der nächste Befehl eingegeben wird, stellt SQL-PLUS fest, dass die Verbindung zur Server-Session nicht mehr existiert:

 SQL> select * from intab;
 select * from intab
 *
 FEHLER in Zeile 1:
 ORA-00028: Ihre Sitzung wurde abgebrochen