2016-10-10 1 views
0

J'ai fait ALTER TABLE DISABLE TABLE LOCK sur l'une de nos tables et maintenant je ne peux plus activer le verrouillage de table. Quand je suis sur l'exécution de ce tableau:Oracle - ALTER TABLE ACTIVATION VERROUILLAGE DE TABLE

ALTER TABLE x ENABLE TABLE LOCK; 

Je reçois:

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

J'ai vérifié qu'il y avait une session de blocage d'un autre utilisateur, mais il a tué sa session et maintenant je peux encore » t activer le verrouillage de la table. Il y a une nouvelle session de verrouillage, ressemblant à une session système (OSUSER = SYSTEM, PROGRAMME = ORACLE.EXE (DIA0), TYPE = BACKGROUND).

Pourriez-vous s'il vous plaît aidez-moi avec ce verrou activer la table? Edit: Après le redémarrage de la base de données, nous avons pu activer le verrou de la table.

+0

Ceci est un processus de diagnostic: https://docs.oracle.com/cloud/latest/db112/REFRN/bgprocesses.htm#REFRN104 –

+0

Autre utilisateur a tué la session mais si la session était en cours de mise à jour ou d'insertion est en cours d'exécution. – Kacper

+0

Essayez 'ALTER SESSION SET DDL_LOCK_TIMEOUT = 600;' avant d'essayer de verrouiller la table. Oracle attendra jusqu'à 10 minutes avant d'obtenir cette erreur, où les autres sessions peuvent terminer leur travail. –

Répondre

0

Exécutez cette requête pour identifier les sessions qui sont le verrouillage de votre objet:

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; 

Avec les résultats de cette requête vous pouvez exécuter ALTER SYSTEM KILL SESSION 'sid,serial#'; qui devrait effacer les serrures et vous pouvez retenter l'acquisition de la serrure. Si vous avez un processus qui re-spawns et acquiert le verrou avant votre session vous pouvez, vous pouvez écrire une boucle while qui vérifie si le verrou peut être acquis en attrapant l'erreur ORA-00054 et réessayer jusqu'à ce que le verrou peut être placé en utilisant LOCK TABLE x IN EXCLUSIVE MODE NOWAIT;

+0

Ma table n'existe pas dans v $ locked_object. Je ne peux voir que BLOCKING_SESSION dans v $ session lorsque j'essaie d'activer le verrou de table. Après avoir bloqué la session, je ne peux toujours pas activer le verrouillage, car la prochaine session bloque toujours ma session. –

+0

Une solution de contournement rapide consiste à exécuter un CTAS: 'CREATE TABLE new_table AS (SELECT * FROM old_table);' et modifiez la table nouvellement créée et ensuite, supprimez la table old_table et renommez celle nouvellement créée [oracle doc à propos de la table renommer] (https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljrenametablestatement.html) – Sebz

+0

Une autre idée pourrait être que vous ayez quelque chose coincé dans votre session en cours, et vous devriez essayer de l'exécuter à nouveau depuis une nouvelle session clean . – Sebz