카카오 플러스

오라클 ORA-00054

컴퓨터2010. 8. 6. 00:09


ORA-00054: 자원이 사용중이고, NOWAIT가 지정되어 있습니다

해결 방법

아래내용은 오라클 Bulletin 에 있는 내용입니다.
====================================================
ORA-54 WHEN DROP A TABLE(LOCK SESSION KILL)
Bulletin no : 10060
=====================================================
ORA-54 WHEN DROP A TABLE(LOCK SESSION KILL)

TABLE에 LOCK이 걸려 있어 DML 및 DDL 명령 사용 시 ORA-54 ERROR가 나오는
경우가 있다.

00054, 00000, "resource busy and acquire with NOWAIT specified"
// *Cause: Resource interested is busy.
// *Action: Retry if necessary.

이 때에는 DB를 RESTART하면 되지만 더 효율적인 해결 방법은 다음과 같이 할
수 있다.
(serial number가 negative인 경우 그 값에 65536을 더해야 한다.)

1. 예를 들어 lock이 걸려 있는 테이블이 emp라고 가정하면 다음 SELECT 문으로

emp 테이블에 lock을 걸고 있는 session을 찾는다.

$ sqlplus system/manager
SQL> select a.sid, a.serial#
from v$session a, v$lock b, dba_objects c
where a.sid=b.sid and
b.id1=c.object_id and
b.type='TM' and
c.object_name='EMP';

SID SERIAL#
--- -------
5 1
6 1

2. 다음 명령으로 SESSION들을 KILL한다.

SQL> alter system kill session '5, 1';
SQL> alter system kill session '6, 1';

이렇게 하여도 킬이 되지 않는 경우 "it is marked for kill" 라는 메세지를 출력하게 됩니다.
 디비에서 select를 끝내지못해서 세션을 죽일 수 없다는 말이 되는데 이런 경우 기다리던가 그것도 되지 않는 경우엔 직접 프로세스를 죽임으로써 해결할 수 있다고 합니다.

-OS 프로세스의 spid 확인법
select spid
from v$process
where addr = (select paddr
from v$session
where s.sid=<조회된sid>
and s.serial#=<조회된 serial#>);

이렇게 spid를 확인 후에 kill -9 [spid] 로 프로세스를 죽인후 기다리면 작업이 죽은것을 확인 할 수 있습니다.