2016-10-10 6 views
0

Ich habe ALTER TABLE DISABLE TABLE LOCK auf einer unserer Tabellen und jetzt kann ich nicht sperren Tabellen sperren. Wenn ich auf dieser Tabelle bin Ausführung:Oracle - ALTER TABLE ENABLE TABLE LOCK

ALTER TABLE x ENABLE TABLE LOCK; 

Ich erhalte:

SQL Error: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

Ich habe, dass es eine blockierende Sitzung von anderen Benutzern war, aber er seine Sitzung getötet und jetzt noch kann ich‘ t Aktivieren Sie die Tabellensperre. Es gibt eine neue Sperrsitzung, die wie eine Systemsitzung aussieht (OSUSER = SYSTEM, PROGRAM = ORACLE.EXE (DIA0), TYPE = BACKGROUND).

Könnten Sie mir bitte mit diesem Enable Table Lock helfen?

Edit: Nach dem Neustart der Datenbank konnten wir die Tabellensperre aktivieren.

+0

Das ist ein Diagnoseprozess: https://docs.oracle.com/cloud/latest/db112/REFRN/bgprocesses.htm#REFRN104 –

+0

Andere Benutzer Sitzung getötet, aber wenn die Sitzung aktualisiert wurde oder Rollback einfügen wird durchgeführt. – Kacper

+0

Versuchen Sie 'ALTER SESSION SET DDL_LOCK_TIMEOUT = 600;', bevor Sie versuchen, die Tabelle zu sperren. Oracle wird bis zu 10 Minuten warten, bis Sie diesen Fehler erhalten, wo andere Sitzungen ihre Jobs beenden können. –

Antwort

0

Run diese Abfrage, um die Sitzungen zu identifizieren, die Ihr Objekt Sperren:

select 
    c.owner, 
    c.object_name, 
    c.object_type, 
    b.sid, 
    b.serial#, 
    b.status, 
    b.osuser, 
    b.machine 
from 
    v$locked_object a , 
    v$session b, 
    dba_objects c 
where 
    b.sid = a.session_id 
and 
    a.object_id = c.object_id; 

Mit Ergebnissen aus dieser Abfrage können Sie ALTER SYSTEM KILL SESSION 'sid,serial#'; ausführen, die Sperren löschen sollten, und Sie können den Erwerb der Sperre wiederholen.

Wenn Sie einen Prozess haben, der die Sperre erneut spawnt und vor Ihrer Sitzung erwirbt, können Sie eine while-Schleife schreiben, die prüft, ob die Sperre durch Abfangen des ORA-00054-Fehlers und erneuten Versuch bis zur Sperre erreicht werden kann kann platziert werden mit LOCK TABLE x IN EXCLUSIVE MODE NOWAIT;

+0

Meine Tabelle existiert nicht in v $ locked_object. Ich kann nur BLOCKING_SESSION in v $ Sitzung sehen, wenn ich versuche, die Tabellensperre zu aktivieren. Nach dem Blockieren der Session-Kill kann ich die Sperre immer noch nicht aktivieren, da immer die nächste Sitzung meine Sitzung blockiert. –

+0

Eine schnelle Problemumgehung besteht darin, ein CTAS auszuführen: 'CREATE TABLE new_table AS (SELECT * FROM old_table);' und die neu erstellte Tabelle ändern und danach die old_table löschen und die neu erstellte Tabelle umbenennen [oracle doc über die Umbenennungstabelle] (https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljrenametablestatement.html) – Sebz

+0

Eine andere Idee könnte sein, dass etwas in Ihrer aktuellen Sitzung stecken geblieben ist, und Sie sollten versuchen, es erneut von einer neuen sauberen Sitzung auszuführen . – Sebz