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