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