webentwicklung-frage-antwort-db.com.de

ORA-00054: Ressource belegt und mit angegebenem NOWAIT abrufen

Ich habe ein Skript beendet, das gerade eine Tabelle aktualisiert. Jetzt, wenn ich das Skript erneut ausführe, erhalte ich:

ORA-00054: Ressource belegt und mit angegebenem NOWAIT abrufen

Ich nehme an, der Tisch ist gesperrt. Wie schalte ich den Tisch frei? Danke im Voraus.

29
wowrt

Schritt 1:

select object_name, s.sid, s.serial#, p.spid 
from v$locked_object l, dba_objects o, v$session s, v$process p
where l.object_id = o.object_id and l.session_id = s.sid and s.paddr = p.addr;

Schritt 2:

alter system kill session 'sid,serial#'; --`sid` and `serial#` get from step 1

Weitere Informationen: http://www.Oracle-base.com/articles/misc/killing-Oracle-sessions.php

60
chyee

Sie müssen leider warten. Die Sitzung, die beendet wurde, befand sich mitten in einer Transaktion und aktualisierte viele Datensätze. Diese Datensätze müssen zurückgesetzt werden und einige Hintergrundprozesse kümmern sich darum. In der Zwischenzeit können Sie die berührten Datensätze nicht ändern.

8
Rob van Wijk

Danke für den Info-User 'user712934'

Sie können auch die SQL-Adresse, den Benutzernamen, den Computer und die Port-Informationen abrufen und den tatsächlichen Prozess abrufen, der die Verbindung hält

SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM,S.USERNAME,
S.MACHINE,S.PORT , S.LOGON_TIME,SQ.SQL_FULLTEXT 
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S, 
V$PROCESS P, V$SQL SQ 
WHERE L.OBJECT_ID = O.OBJECT_ID 
AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR 
AND S.SQL_ADDRESS = SQ.ADDRESS;
8
Abey Tom

Wenn Sie die Sitzung beendet haben, bleibt die Sitzung eine Weile im Status "KILLED", während Oracle danach aufräumt.

Wenn Sie es unbedingt müssen, können Sie auch den OS-Prozess beenden (siehe v$process.spid), der alle Sperren aufheben würde, an denen er festhielt.

Weitere Informationen finden Sie unter this .

6
Jeffrey Kemp

Abhängig von Ihrer Situation ist die gesperrte Tabelle möglicherweise Teil eines normalen Vorgangs und Sie möchten die Sperrtransaktion nicht einfach beenden. Sie möchten, dass Ihre Anweisung auf die andere Ressource wartet. Oracle 11g hat DDL-Zeitüberschreitungen, die eingestellt werden können um damit umzugehen.

Wenn Sie mit 10g zu tun haben, müssen Sie kreativer werden und PL/SQL schreiben, um den erneuten Versuch zu bewältigen. Schauen Sie sich In Oracle 10g ORA-00054 umgehen Dies führt Ihre Anweisung erneut aus, wenn eine resource_busy-Ausnahme auftritt.

3
Nick Kavadias