sql >> Database >  >> RDS >> Oracle

ORA-00054:resource bezet en verwerven met NOWAIT gespecificeerd

ORA-00054:resource bezet en verwerven met NOWAIT gespecificeerd is een veelvoorkomende fout in Oracle Database

Referentie: Oracle-documentatie

Dit gebeurt meestal wanneer u een DDL probeert uit te voeren op de tafel die is vergrendeld door een transactie. Het gebeurt ook als de opdracht select for update wordt uitgevoerd met de NOWAIT-optie

Voorbeeld

SQL> alter table emp add (middlename varchar2(15));
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified

SQL> create index  emp_idx on emp(emp_no);

*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified

SQL> Select * from emp for update NOWAIT;

*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified

Hoe de ORA-00054-fout te voorkomen

1.Doe de DDL in het onderhoudsvenster of tijdens de daluren wanneer er geen transactie plaatsvindt

2.  Met 11g hebben we DDL_LOCK_TIMEOUT,

Hiermee geeft u eenvoudig aan hoe lang u wilt wachten op de DDL-vergrendeling

SQL> alter session set ddl_lock_timeout = 600;
Session altered.

SQL> alter table emp add (middlename varchar2(15));

Table Altered

3.  We kunnen de transactie beëindigen die de orakelsloten bevat en er vervolgens mee doorgaan

column sid_ser format a12 heading 'session,|serial#'; 
column username format a12 heading 'os user/|db user'; 
column process format a9 heading 'os|process'; 
column spid format a7 heading 'trace|number'; 
column owner_object format a35 heading 'owner.object'; 
column locked_mode format a13 heading 'locked|mode'; 
column status format a8 heading 'status'; 
select 
    substr(to_char(l.session_id)||','||to_char(s.serial#),1,12) sid_ser, 
    substr(l.os_user_name||'/'||l.oracle_username,1,12) username, 
    l.process, 
    p.spid, 
    substr(o.owner||'.'||o.object_name,1,35) owner_object, 
    decode(l.locked_mode, 
             1,'No Lock', 
             2,'Row Share', 
             3,'Row Exclusive', 
             4,'Share', 
             5,'Share Row Excl', 
             6,'Exclusive',null) locked_mode, 
    substr(s.status,1,8) status 
from 
    v$locked_object l, 
    all_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 
and s.status != 'KILLED'
/

Zodra je de blokkeersessie hebt gevonden en hebt besloten om de oracle-sessie te beëindigen, kunnen we onderstaande query gebruiken om de kill-sessie sql te genereren

select 'alter system kill session '''||sid||','||serial#||''';' from v$session where sid=&1;

4.Als u ORA-00054:resource bezet krijgt en verwerven met NOWAIT gespecificeerd in het aanvraagformulier, ga dan als volgt te werk

We hebben een geval waarin we ORA-00054 tegenkomen:resource bezet en verwerven met NOWAIT gespecificeerd in het aanvraagformulier. Nu wordt het in dit geval erg moeilijk om de sloten te vinden, omdat de applicatie niet op het slot wacht. Dit gebeurt meestal wanneer toepassingsproblemen selecteren voor update zonder wachtoptie. We kunnen vergrendelingen vinden via dba_waiters wanneer de sessie op de vergrendeling wacht. Omdat het wordt vergrendeld met nowait session, kunnen we het niet zomaar vinden.

We moeten de Oracle SQL-tracering voor de sessie vinden en het probleem reproduceren. Zodra het spoor beschikbaar is. We moeten zoeken naar err=54 in het traceerbestand

PARSING IN CURSOR #18446744071497070208 len=167 dep=1 uid=173 oct=3 lid=173 tim=3315832569154 hv=817497356 ad='31afc8bcd0' sqlid='6gvfwr8sbn18c'
SELECT GROUP_MARK_ID FROM MTL_INV_SERIAL_NUMBERS WHERE CURRENT_ORGANIZATION_ID = :B3 AND INVENTORY_ITEM_ID = :B2 AND SERIAL_NUMBER = :B1 FOR UPDATE OF GROUP_MARK_ID NOWAIT
END OF STMT
PARSE #18446744071497070208:c=53,e=52,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,plh=1906360410,tim=3315832569152
BINDS #18446744071497070208:
Bind#0
oacdty=02 mxl=22(21) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1206001 frm=00 csi=00 siz=80 off=0
kxsbbbfp=ffffffff7c203028 bln=22  avl=03  flg=05
value=23
Bind#1
oacdty=02 mxl=22(21) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1206001 frm=00 csi=00 siz=0 off=24
xsbbbfp=ffffffff7c203040 bln=22  avl=05  flg=01
value=11111
Bind#2
oacdty=01 mxl=32(30) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1206001 frm=01 csi=871 siz=0 off=48
kxsbbbfp=ffffffff7c203058 bln=32  avl=08  flg=01
value="1222333"
EXEC #18446744071497070208:c=1167,e=1167,p=0,cr=9,cu=1,mis=0,r=0,dep=1,og=1,plh=1906360410,tim=3315832570599
ERROR #18446744071497070208:err=54 tim=3315832570735
STAT #18446744071497070208 id=1 cnt=0 pid=0 pos=1 obj=0 op='FOR UPDATE  (cr=0 pr=0 pw=0 time=0 us)'

De regel die de fout toont en het gedeelte hierboven toont de verklaring die de fout geeft

SELECT GROUP_MARK_ID FROM MTL_INV_SERIAL_NUMBERS WHERE CURRENT_ORGANIZATION_ID = :B3 AND INVENTORY_ITEM_ID = :B2 AND SERIAL_NUMBER = :B1 FOR UPDATE OF GROUP_MARK_ID NOWAIT

Om nu de blokkeersessie te vinden, moeten we de instructie in sqlplus activeren met de NOWAIT-optie

SELECT GROUP_MARK_ID FROM MTL_INV_SERIAL_NUMBERS WHERE CURRENT_ORGANIZATION_ID = :B3 AND INVENTORY_ITEM_ID = :B2 AND SERIAL_NUMBER = :B1 FOR UPDATE OF GROUP_MARK_ID ;

Dan wacht deze sessie en kunnen we de blokkeersessie gemakkelijk vinden van dba_waiters en de blokkeersessie beëindigen.

5. Met Oracle 11g en Oracle 12c hebben we veel DDL-activiteiten die online kunnen worden gedaan zonder onderbreking van de fout ORA-00054

SQL> create index  emp_idx on emp(emp_no) online;

Vanaf 12c kunt u het ONLINE-trefwoord gebruiken met de opdrachten DROP INDEX, DROP CONSTRAINT, ALTER INDEX UNUSABLE en SET COLUMN UNUSED

Verwante artikelen

ORA-00942 tabel of weergave bestaat niet
ORA-28000 het account is vergrendeld
ORA-28002
ORA-00904:ongeldige identifier
ORA-01017:ongeldige gebruikersnaam/wachtwoord; aanmelding geweigerd
verander de kill-sessie van het systeem


  1. Een SQL Server Agent-taak maken in Azure Data Studio

  2. MySQL-replicatie:foutieve transacties in op GTID gebaseerde replicatie

  3. Ontdek welk valutasymbool uw sessie gebruikt in Oracle

  4. SetDate gebruiken in PreparedStatement