De ce primesc aceasta eroare baza de date atunci când am actualiza un tabel?
EROARE la linia 1: ORA-00054: resurse ocupat și de a dobândi cu NOWAIT specificate sau de expirare a expirat
Masa este deja blocat de unele interogare. De exemplu, poate fi executat "selectați pentru a actualiza" și nu au comis/rollbacked și a tras-o altă interogare de selectare. Face un commit/rollback înainte de a executa interogarea.
De asemenea, puteți căuta sql,nume de utilizator,o mașină,un port de informații și de a ajunge la proces real care deține o conexiune
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;
Vă Rugăm Să Omoare Oracle Sesiune
Folosesc de mai jos interogare pentru a verifica sesiune activă info
SELECT
O.OBJECT_NAME,
S.SID,
S.SERIAL#,
P.SPID,
S.PROGRAM,
SQ.SQL_FULLTEXT,
S.LOGON_TIME
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;
ucide ca
alter system kill session 'SID,SERIAL#';
(De exemplu, modifice sistemul de omor sesiune '13,36543'
;)
Referință http://abeytom.blogspot.com/2012/08/finding-and-fixing-ora-00054-resource.html
Acolo este un foarte ușor de lucru în jurul valorii de această problemă.
Dacă tu a alerga un 10046 urme pe sesiune (google asta... e prea mult de explicat). Veți vedea că, înainte de orice DDL operare Oracle face următoarele:
MASĂ DE BLOCARE 'TABLE_NAME' NU AȘTEPTAȚI
Deci, dacă o altă sesiune a deschis o tranzacție obține o eroare. Deci fix este... tobele va rog. Problema propria dvs. de blocare înainte de DDL și lăsa 'NU AȘTEPTAȚI'.
Notă Specială:
dacă faci divizare/cădere partiții oracle doar blochează partiție. ... deci yo pot bloca doar partiția subpartition.
Deci... Următorii pași rezolva problema.
DML declarații va 'stai' sau ca dezvoltatorii numesc 'stea' în timp ce tabelul este blocat.
Eu folosesc acest lucru în codul care se execută la un loc de muncă să scadă partiții. Acesta funcționează bine. Acesta este într-o bază de date care este în mod constant introducerea la o rată de câteva sute de insertii/secundă. Fără erori.
dacă vă întrebați. Face acest lucru în 11g. Am făcut acest lucru într-10g înainte la fel de bine în trecut.
Această eroare se produce atunci când resursa este ocupată. Verificați dacă aveți orice constrângeri referențiale în interogare. Sau chiar tabele pe care le-am menționat în interogare poate fi ocupat. Acestea ar putea fi angajat cu un alt loc de muncă, care va fi cu siguranță enumerate în următorul rezultatele interogării:
SELECT * FROM V$SESSION WHERE STATUS = 'ACTIVE'
Găsi SID,
SELECT * FROM V$OPEN_CURSOR WHERE SID = --the id
În cazul meu, am fost destul de sigur că a fost unul dintre mea sesiuni care a fost blocarea. Prin urmare, este sigur să faceți următoarele:
SELECT * FROM V$SESSION UNDE OSUSER='my_local_username';
Sesiunea a fost inactiv, dar nu a avut loc încă de blocare într-un fel. Rețineți că poate fi necesar să utilizați o altă UNDE condiție în cazul dumneavoastră (de exemplu, încercați să "numele de UTILIZATOR" sau "MAȘINĂ" câmpuri).
modifice sistemul de omor sesiune de '<id>, <serial#>';
Editat de @thermz: Dacă niciuna din precedentele deschide-sesiune de întrebări munca încercați această unul. Această interogare poate ajuta pentru a evita erori de sintaxă în timp ce uciderea sesiuni:
SELECTA 'să MODIFICE SISTEMUL de OMOR SESIUNE '''||SID||','||SERIAL#||''' imediate;' DE la V$SESSION UNDE OSUSER='my_local_username_on_OS'
Acest lucru se întâmplă atunci când o sesiune alta decât cea utilizată pentru a modifica un tabel deține un sistem de blocare probabil din cauza unei DML (update/delete/insert). Dacă sunteți în curs de dezvoltare un nou sistem, este probabil ca tu sau cineva din echipa ta probleme declarația de actualizare și te-ar putea ucide sesiune fără prea mult consecință. Sau ai putea comite din acea sesiune odată ce știi cine a sesiunii deschise.
Dacă aveți acces la un SQL admin sistemul folosi pentru a găsi ofensatoare sesiune. Și poate ucide.
Ai putea folosi v$session și v$de blocare și altele, dar vă sugerez google cum de a găsi acea sesiune și apoi cum să-l omoare.
Într-un sistem de producție, depinde. Pentru oracle 10g și mai în vârstă, ai putea executa
LOCK TABLE mytable in exclusive mode;
alter table mytable modify mycolumn varchar2(5);
Într-o sesiune separată, dar avea următoarele gata în cazul în care este nevoie de prea mult timp.
alter system kill session '....
Depinde de ce sistem ai, sistemele mai vechi, sunt mult mai probabil pentru a nu comite de fiecare dată. Asta este o problemă, deoarece nu poate fi de lungă durată încuietori. Deci, de blocare ar împiedica orice nouă încuietori și așteptați pentru un sistem de blocare care cine știe când va fi lansat. Care este de ce aveți altă declarație gata. Sau ai putea să te uiți pentru UNIX script-uri de acolo, care fac lucruri similare în mod automat.
În versiunea 11g există o nouă variabilă de mediu, care stabilește o perioadă de așteptare. Cred că a face ceva similar cu ceea ce am descris. Tine minte ca de blocare probleme don't să dispară.
ALTER SYSTEM SET ddl_lock_timeout=20;
alter table mytable modify mycolumn varchar2(5);
În cele din urmă că ar fi mai bine să așteptați până când sunt puțini utilizatori în sistem pentru a face acest tip de întreținere.
Doar verifica pentru procesul care deține sesiune și să-l Ucidă. Își reveni la normal.
Mai jos SQL va găsi procesul
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.program FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id;
Apoi l omoare
ALTER SYSTEM KILL SESSION 'sid,serial#'
SAU
un exemplu l-am găsit online pare să aibă nevoie de la id de instanță, precum și modifica sistemul de omor sesiune '130,620,@1';
Am reusit sa lovit de aceasta eroare, atunci când pur și simplu a crea un tabel! Acolo a fost, evident, nici un conflict problemă pe o masă care nu't există încă. `CREAȚI TABELUL declarația conținea o CONSTRÂNGERE fk_name CHEIE EXTERNĂ clauza de referire la o bine-populate de masă. Am avut de a:
Am avut această eroare se întâmplă atunci când am avut 2 script-uri am fost difuzate. Am avut:
Am făcut o masă picătură, apoi crearea de masă ca contul #1.
Am dat un tabel de actualizare pe contul #2's-a sesiune. Nu a comis-o schimbă.
Re-ran tabel drop/crearea script ca contul #1. Am eroare pe drop table x
comanda.
Am rezolvat-o prin rularea `a COMIS; în SQL*Plus a sesiune a cont #2.
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;
ALTER SYSTEM KILL SESSION 'sid,serial#';
Soluția dată de Shashi's link-ul este cel mai bun... nu are nevoie să contactați dba sau altcineva
face o copie de rezervă
create table xxxx_backup as select * from xxxx;
șterge toate rândurile
delete from xxxx;
commit;
introduce-ți rezervă.
insert into xxxx (select * from xxxx_backup);
commit;