2010-06-19 21 views
26

Ho ucciso uno script che si trovava nel mezzo dell'aggiornamento di una tabella. Ora, quando ho rieseguire lo script sto ottenendo,ORA-00054: risorsa occupata e acquisita con NOWAIT specificato

ORA-00054: risorsa occupata e acquisire con NOWAIT specificato

Presumo la tabella è bloccata ?. Come sblocco il tavolo? Grazie in anticipo.

risposta

7

Dovrai aspettare. La sessione che è stata uccisa era nel mezzo di una transazione e ha aggiornato molti record. Questi record devono essere sottoposti a rollback e alcuni processi in background si occupano di ciò. Nel frattempo non è possibile modificare i record che sono stati toccati.

+0

Questo ha funzionato per me quando il passaggio 1 di @ chyee non ha restituito alcuna riga. – stephen

4

Quando hai ucciso la sessione, la sessione si blocca per un po 'in stato "KILLED" mentre Oracle lo pulisce dopo.

Se è assolutamente necessario, è possibile interrompere anche il processo del sistema operativo (cercare v$process.spid), che rilascerebbe qualsiasi blocco su cui si è bloccato.

Vedere this per informazioni più dettagliate.

56

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

fase 2:

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

Maggiori informazioni: http://www.oracle-base.com/articles/misc/killing-oracle-sessions.php

+0

Ottengo l'errore ORA-00054 ma la selezione non ottiene alcuna riga. – Kiquenet

+16

STEP 1 mi dà ORA-00942: tabella o vista non esiste – Yokhen

+1

Si salva la mia notte :) –

7

Grazie per le informazioni utente 'user712934'

È possibile anche cercare il sql, nome utente, macchina, informazioni sulla porta e arriva al processo effettivo che contiene la connessione

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; 
+0

Tra tutte le risposte su questa pagina, questo mi ha aiutato di più. Quando viene visualizzato l'errore nella domanda originale, eseguo questa query. Questa query mi dice quali tabelle sono attualmente bloccate. Sorpreso che non ha più upvotes .... –

3

A seconda della situazione, la tabella da bloccato può essere solo parte di una normale operazione & non si vuole uccidere solo la transazione di blocco. Quello che vuoi fare è che la tua dichiarazione attenda l'altra risorsa. Oracle 11g has DDL timeouts which can be set per far fronte a questo.

Se si ha a che fare con 10g, è necessario essere più creativi e scrivere alcuni PL/SQL per gestire il re-try. Guarda Getting around ORA-00054 in Oracle 10g Questa operazione esegue nuovamente l'istruzione quando si verifica un'eccezione resource_busy.

Problemi correlati