Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

ORA-00054:tài nguyên bận và có được với NOWAIT được chỉ định

ORA-00054:tài nguyên bận và có được với NOWAIT được chỉ định là một lỗi phổ biến trong Cơ sở dữ liệu Oracle

Tham khảo:Tài liệu Oracle

Điều này thường xảy ra khi bạn cố gắng thực hiện một DDL trên bảng bị khóa bởi giao dịch. Điều này cũng xảy ra nếu câu lệnh select for update được thực thi với tùy chọn NOWAIT

Ví dụ

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

Cách ngăn lỗi ORA-00054

1. Thực hiện DDL trong cửa sổ Bảo trì hoặc ngoài giờ cao điểm khi không có giao dịch nào diễn ra

2. Với 11g, chúng ta có DDL_LOCK_TIMEOUT,

Điều này chỉ đơn giản là chỉ định bạn muốn nó đợi khóa DDL trong bao lâu

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

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

Table Altered

3. Chúng tôi có thể kết thúc giao dịch giữ khóa oracle và sau đó tiếp tục với nó

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

Khi bạn đã tìm thấy phiên chặn và quyết định hủy phiên oracle, chúng tôi có thể sử dụng truy vấn bên dưới để tạo sql phiên hủy

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

4.Nếu bạn đang nhận được ORA-00054:tài nguyên bận và có được với NOWAIT được chỉ định trong Đơn đăng ký, sau đó tiến hành như bên dưới

Chúng tôi có trường hợp chúng tôi gặp ORA-00054:tài nguyên bận và có được với NOWAIT được chỉ định trong Biểu mẫu ứng dụng. Bây giờ trong trường hợp này, rất khó tìm thấy ổ khóa vì ứng dụng không đợi khóa. Điều này thường xảy ra khi các sự cố ứng dụng chọn cập nhật mà không có tùy chọn chờ. Chúng tôi có thể tìm thấy các khóa thông qua dba_waiters khi phiên chờ khóa. Vì phiên này đang khóa với phiên nowait, chúng tôi không thể tìm thấy nó.

Chúng tôi sẽ cần tìm dấu vết sql oracle cho phiên và tái tạo vấn đề. Khi đã có dấu vết. Chúng ta cần tìm err =54 trong tệp theo dõi

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

Dòng hiển thị lỗi và phần ở trên hiển thị câu lệnh đưa ra lỗi

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

Bây giờ để tìm phiên chặn, chúng ta cần kích hoạt câu lệnh trong sqlplus với tùy chọn NOWAIT

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 ;

Sau đó, phiên này sẽ đợi và chúng tôi có thể dễ dàng tìm thấy phiên chặn từ dba_waiters và hủy phiên chặn.

5.Với Oracle 11g và Oracle 12c, chúng tôi có rất nhiều hoạt động DDL có thể được thực hiện trực tuyến mà không bị gián đoạn lỗi ORA-00054

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

Bắt đầu từ 12c, bạn có thể sử dụng từ khóa ONLINE với các lệnh DROP INDEX, DROP CONSTRAINT, ALTER INDEX UNUSABLE và SET COLUMN UNUSED

Các bài viết có liên quan

Bảng hoặc chế độ xem ORA-00942 không tồn tại
ORA-28000 tài khoản bị khóa
ORA-28002
ORA-00904:số nhận dạng không hợp lệ
ORA-01017:tên người dùng / mật khẩu không hợp lệ; đăng nhập bị từ chối
thay đổi phiên hủy hệ thống


  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 clob từng dòng với pl \ sql

  2. Làm cách nào để tạo id với AUTO_INCREMENT trên Oracle?

  3. Tạo sha1-hash của một hàng trong Oracle

  4. Các hàm một hàng trong Oracle sql

  5. Oracle PL / SQL Collections - Thêm các phần tử vào một bảng hiện có