Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ORA-00054:निर्दिष्ट NOWAIT के साथ संसाधन व्यस्त और अधिग्रहण

ORA-00054:निर्दिष्ट NOWAIT के साथ व्यस्त संसाधन और अधिग्रहण Oracle डेटाबेस में देखी जाने वाली एक सामान्य त्रुटि है

संदर्भ: Oracle दस्तावेज़ीकरण

यह आम तौर पर तब होता है जब आप टेबल पर एक डीडीएल निष्पादित करने का प्रयास करते हैं जो लेनदेन द्वारा बंद कर दिया जाता है। यह तब भी होता है जब अपडेट स्टेटमेंट के लिए चयन को NOWAIT विकल्प के साथ निष्पादित किया जाता है

उदाहरण

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

ओआरए-00054 त्रुटि को कैसे रोकें

1. जब कोई लेन-देन नहीं हो रहा हो तो डीडीएल को रखरखाव विंडो में या व्यस्ततम घंटों में करें

2.  11g के साथ, हमारे पास DDL_LOCK_TIMEOUT,

. है

यह केवल यह निर्दिष्ट करता है कि आप कितनी देर तक डीडीएल लॉक की प्रतीक्षा करना चाहेंगे

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

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

Table Altered

3.  हम उस लेन-देन को समाप्त कर सकते हैं जिसमें ऑरैकल लॉक है और फिर उसके साथ आगे बढ़ें

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'
/

एक बार जब आप ब्लॉकिंग सेशन ढूंढ लेते हैं और ऑरैकल सेशन को खत्म करने का फैसला कर लेते हैं, तो हम किल सेशन sql जेनरेट करने के लिए नीचे दी गई क्वेरी का उपयोग कर सकते हैं

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

4.यदि आप ORA-00054:संसाधन व्यस्त हैं और NOWAIT निर्दिष्ट के साथ प्राप्त कर रहे हैं आवेदन पत्र में, फिर नीचे की तरह आगे बढ़ें

हमारे पास ऐसा मामला है जहां हम ORA-00054 का सामना करते हैं:संसाधन व्यस्त और आवेदन पत्र में निर्दिष्ट NOWAIT के साथ अधिग्रहण। अब इस मामले में ताले को ढूंढना बहुत मुश्किल हो जाता है क्योंकि एप्लिकेशन लॉक की प्रतीक्षा नहीं करता है। यह आम तौर पर तब होता है जब एप्लिकेशन मुद्दे बिना प्रतीक्षा विकल्प के अपडेट के लिए चुनते हैं। जब सत्र लॉक की प्रतीक्षा करता है तो हम dba_waiters के माध्यम से ताले ढूंढ सकते हैं। चूंकि यह अभी सत्र के साथ लॉक हो रहा है, हम इसे ढूंढ नहीं सकते हैं।

हमें सत्र के लिए ऑरैकल एसक्यूएल ट्रेस ढूंढना होगा और समस्या को पुन:उत्पन्न करना होगा। एक बार ट्रेस उपलब्ध हो जाने के बाद। हमें ट्रेस फ़ाइल में err=54 खोजने की आवश्यकता है

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)'

त्रुटि दिखाने वाली रेखा और ऊपर का भाग त्रुटि देने वाले कथन को दर्शाता है

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

अब ब्लॉकिंग सेशन को खोजने के लिए, हमें NOWAIT विकल्प के साथ sqlplus में स्टेटमेंट को फायर करना होगा

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 ;

फिर यह सत्र प्रतीक्षा करेगा और हम आसानी से dba_waiters से ब्लॉकिंग सेशन ढूंढ सकते हैं और ब्लॉकिंग सेशन को खत्म कर सकते हैं।

5. Oracle 11g और Oracle 12c के साथ, हमारे पास बहुत सारी DDL गतिविधियाँ हैं जो ORA-00054 त्रुटि के बिना किसी रुकावट के ऑनलाइन की जा सकती हैं

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

12c से, आप DROP INDEX, DROP CONSTRAINT, ALTER INDEX UNUSABLE और SET COLUMN UNUSED कमांड के साथ ONLINE कीवर्ड का उपयोग कर सकते हैं

संबंधित लेख

ORA-00942 तालिका या दृश्य मौजूद नहीं है
ORA-28000 खाता लॉक है
ORA-28002
ORA-00904:अमान्य पहचानकर्ता
ORA-01017:अमान्य उपयोगकर्ता नाम/पासवर्ड; लॉगऑन अस्वीकृत
सिस्टम किल सत्र में बदलाव करें


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-00942:स्कीमा.टेबल से चयन कर सकते हैं लेकिन टेबल से नहीं?

  2. तारीख को पार्स करने के बाद Oracle सेलेक्ट स्टेटमेंट से वापसी संख्या

  3. Oracle में डुप्लिकेट पंक्तियों को हटाने के 2 तरीके

  4. Oracle में किसी तालिका को उपनाम देने के लिए 'as' कीवर्ड का उपयोग कैसे करें?

  5. Oracle पिवट क्वेरी कॉलम नामों के आसपास उद्धरणों के साथ कॉलम देती है। क्या?