web-dev-qa-db-fra.com

ORA-00054: ressource occupée et acquisition avec NOWAIT spécifié

J'ai tué un script qui était en train de mettre à jour une table. Maintenant, quand je relance le script que je reçois,

ORA-00054: ressource occupée et acquisition avec NOWAIT spécifié

Je suppose que la table est verrouillée?. Comment déverrouiller la table?. Merci d'avance.

29
wowrt

Étape 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;

Étape 2:

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

Plus d'informations: http://www.Oracle-base.com/articles/misc/killing-Oracle-sessions.php

60
chyee

Vous allez devoir patienter. La session qui a été tuée était au milieu d'une transaction et a mis à jour de nombreux enregistrements. Ces enregistrements doivent être annulés et un processus d'arrière-plan s'en occupe. En attendant, vous ne pouvez pas modifier les enregistrements qui ont été touchés.

8
Rob van Wijk

Merci pour l'info utilisateur 'user712934'

Vous pouvez également rechercher les informations SQL, nom d'utilisateur, machine, port et accéder au processus réel qui détient la connexion.

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

Lorsque vous avez tué la session, la session traîne pendant un certain temps dans l'état "KILLED" pendant qu'Oracle nettoie après.

Si vous le devez absolument, vous pouvez également tuer le processus du système d'exploitation (recherchez v$process.spid), ce qui libérerait tous les verrous auxquels il tenait.

Voir this pour des informations plus détaillées.

6
Jeffrey Kemp

Selon votre situation, la table verrouillée peut simplement faire partie d'une opération normale et vous ne voulez pas simplement tuer la transaction de blocage. Ce que vous voulez faire, c'est que votre relevé attende l'autre ressource. Oracle 11g a des délais d'expiration DDL qui peuvent être définis pour y faire face.

Si vous avez affaire à 10g, vous devez faire preuve de plus de créativité et écrire du PL/SQL pour gérer la nouvelle tentative. Regardez Contourner ORA-00054 dans Oracle 10g Cela réexécute votre instruction lorsqu'une exception resource_busy se produit.

3
Nick Kavadias