Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

ORA-00054:sumber daya sibuk dan dapatkan dengan SEKARANG ditentukan

ORA-00054:sumber daya sibuk dan diperoleh dengan SEKARANG ditentukan adalah kesalahan umum yang terlihat di Oracle Database

Referensi: Dokumentasi Oracle

Hal ini biasanya terjadi saat Anda mencoba menjalankan DDL pada tabel yang dikunci oleh transaksi. Hal ini juga terjadi jika  pernyataan pilih untuk pembaruan dijalankan dengan opsi SEKARANG

Contoh

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

Cara mencegah kesalahan ORA-00054

1.Lakukan DDL di jendela Pemeliharaan atau di luar jam sibuk ketika tidak ada transaksi yang terjadi

2.  Dengan 11g, kita memiliki DDL_LOCK_TIMEOUT,

Ini hanya menentukan berapa lama Anda ingin menunggu kunci DDL

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

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

Table Altered

3.  Kita dapat menghentikan transaksi yang menahan kunci oracle dan kemudian melanjutkannya

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

Setelah Anda menemukan sesi pemblokiran dan memutuskan untuk mematikan sesi Oracle, kita dapat menggunakan kueri di bawah ini untuk menghasilkan sql sesi pembunuhan

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

4.Jika Anda mendapatkan ORA-00054:sumber daya sibuk dan dapatkan dengan SEKARANG ditentukan dalam formulir Aplikasi, lalu lanjutkan seperti di bawah ini

Kami memiliki kasus di mana kami menemukan ORA-00054:sumber daya sibuk dan memperoleh dengan SEKARANG ditentukan dalam formulir Aplikasi. Sekarang dalam hal ini menjadi sangat sulit untuk menemukan kunci karena aplikasi tidak menunggu kunci. Ini biasanya terjadi ketika masalah aplikasi pilih untuk pembaruan tanpa opsi menunggu. Kami dapat menemukan kunci melalui dba_waiters ketika sesi menunggu kunci. Karena mengunci dengan sesi sekarang, kami tidak dapat menemukannya begitu saja.

Kita perlu menemukan pelacakan Oracle sql untuk sesi tersebut dan mereproduksi masalahnya. Setelah jejak tersedia. Kita perlu mencari err=54 di file trace

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

Baris yang menunjukkan kesalahan dan bagian di atas menunjukkan pernyataan yang memberikan kesalahan

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

Sekarang untuk menemukan sesi pemblokiran, kita perlu menjalankan pernyataan di sqlplus dengan opsi SEKARANG

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 ;

Kemudian sesi ini akan menunggu dan kita dapat dengan mudah menemukan sesi pemblokiran dari dba_waiters dan mematikan sesi pemblokiran.

5.Dengan Oracle 11g dan Oracle 12c, kami memiliki banyak aktivitas DDL yang dapat dilakukan secara online tanpa gangguan kesalahan ORA-00054

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

Mulai 12c, Anda dapat menggunakan kata kunci ONLINE dengan perintah DROP INDEX, DROP CONSTRAINT, ALTER INDEX UNUSABLE dan SET COLUMN UNUSED

Artikel Terkait

Tabel atau tampilan ORA-00942 tidak ada
ORA-28000 akun terkunci
ORA-28002
ORA-00904:pengenal tidak valid
ORA-01017:nama pengguna/sandi tidak valid; logon ditolak
ubah sesi penghentian sistem


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. C#:Berikan tipe yang ditentukan pengguna ke prosedur tersimpan Oracle

  2. Hasil Cache

  3. Cara Menjalankan Create Table DDL Dengan EXECUTE IMMEDIATE Di Oracle Database

  4. Bagaimana saya bisa menjalankan skrip SQL asli di JPA/Hibernate?

  5. Oracle ODP.Net dan EF CodeFirst - Kesalahan SaveChanges