Tabelle gesperrt

Frankdfe

Erfahrenes Mitglied
Hallo,

ich habe eine Tabelle, die ich gerne löschen würde. Wenn ich das mit "DROP TABLE" versucht, kommt nach einer Weile die Fehlermeldung
ORA-04021: timeout occurred while waiting to lock object <tabellenname>
Es greifen keine anderen Prozesse auf diese Tabelle zu (Es kann vielleicht sein, dass irgendwo noch ein Prozess hängt). Wie kann ich diese Tabelle entsperren (und dann entfernen)? Kann ich irgendwie herausfinden, warum/wer diese Tabelle sperrt?

Datensätze einfügen, löschen, etc. funktioniert. Die Tabellenstruktur kann ich auch nicht ändern ("ALTER TABLE ...").

Die Datenbank möchte ich nur ungern neu starten.
 
Zur Demo habe ich mal eine Lock Situation nachgestellt:

Session 1:
Code:
SQL> conn test/test
Connect durchgef³hrt.
SQL> create table test (
  2  id number(10) not null
  3  );
Tabelle wurde angelegt.

SQL> update test set id = 3 where id = 1000;

1 Zeile wurde aktualisiert.
Ich mache KEIN! Commit;

Session 2:
Code:
SQL> conn test/test
Connect durchgef³hrt.
SQL> update test set id = 50;
/* ... hier bleibt er stehen... ein LOCK */

3. Session als sysdba
Code:
SQL>    select  /*+ rule */
  2      decode(L.REQUEST,0,'NO','YES') WAIT,
  3     S.OSUSER, S.PROCESS, S.USERNAME LOCKER, U.NAME T_OWNER,
  4     O.NAME OBJECT_NAME, '  '||S.PROGRAM PROGRAM
  5     from    V$LOCK L, V$SESSION S, OBJ$ O, USER$ U
  6     where   U.USER# = O.OWNER# and     S.SID = L.SID
  7     and     L.ID1 = O.OBJ#  and     L.TYPE = 'TM'
  8     union
  9     select  decode(L.REQUEST,0,'NO','YES') WAIT,
 10     S.OSUSER, S.PROCESS, S.USERNAME LOCKER, '-',
 11             'Record(s)', '  '||S.PROGRAM PROGRAM
 12     from    V$LOCK L,               V$SESSION S
 13     where   S.SID = L.SID and     L.TYPE = 'TX'
 14     order by 7,5,1,2,6
 15  /

WAI OSUSER                         PROCESS      LOCKER                         T_OWNER
--- ------------------------------ ------------ ------------------------------ ------------------------------
OBJECT_NAME                    PROGRAM
------------------------------ ------------------------------------------------------------------
NO  EXCEPTIONFAULT\Administrator   3408:1888    TEST                           -
Record(s)                        sqlplus.exe

NO  EXCEPTIONFAULT\Administrator   3620:1372    TEST                           -
Record(s)                        sqlplus.exe

YES EXCEPTIONFAULT\Administrator   3620:1372    TEST                           -
Record(s)                        sqlplus.exe

NO  EXCEPTIONFAULT\Administrator   3408:1888    TEST                           TEST
TEST                             sqlplus.exe

NO  EXCEPTIONFAULT\Administrator   3620:1372    TEST                           TEST
TEST                             sqlplus.exe

Sorry für die schlechte Formatierung. Aber das Statement kannst du einfach rauskopieren. Es zeigt dir die Tabellen und Objekte an auf denen gerade ein Lock sitzt.
Hoffe ich konnte ein wenig helfen.

Das Script ist ein Ausschnitt aus einem SQL Script der Firma Trivadis, nur um das Copyright nicht zu vergessen ;-)
 
Zuletzt bearbeitet:
Das SQL-Statement liefert in der Form bei mir keine Resultate. Ich hab es etwas angepasst, dadurch die "blockierenden" Prozesse ermitteln und nach deren Beendigung die Tabelle löschen können.

Danke!
 

Neue Beiträge

Zurück