오라클을 사용하다 보면 가끔 예기치 않은 오류를 만날 때가 있습니다. 저같은 경우는 Java를 이용하여 not null인 필드에 null값을 넣으려다가 ora-00054에러가 발생하였는데요.
이 ora-00054 에러는 테이블 lock과 관련된 에러로 이 상태가 유지되면 테이블을 지울수도 변경할 수가 없게 됩니다.
SQL 오류: ORA-00054: 리소스가 사용 중이어서 NOWAIT가 지정되었거나 시간 초과가 만료된 상태로 획득합니다. 00000 - "resource busy and acquire with NOWAIT specified" *Cause: Resource interested is busy. *Action: Retry if necessary.
위와 같은 에러로 인하여 테이블인 not null 속성을 바꾸기 위해 테이블 drop을 시도 하였지만 수행할 수 없었습니다.
1.해결 방법
해결 하기 위해선 문제가 되는 테이블을 상태를 개선해야 합니다.
SELECT A.SID
, A.SERIAL#
, A.STATUS
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 = '테이블명';
위의 쿼리를 수행하면 문제가 되는 테이블의 상태를 확인할 수 있습니다.
쿼리를 조회해 보니 해당 테이블의 status가 inacive상태인 것을 확인할 수 있습니다.
ALTER SYSTEM KILL SESSION ‘SID번호, SERIAL번호’;
위의 쿼리는 현상이 발생한 object의 sid번호와 serial 번호를 이용하여 세션을 죽이는 쿼리 입니다.
해당 세션을 끊어주면 문제는 해결 되는데요. 반드시 같은 문제가 발생되지 않기 위해 원인이 되는 현상을 개선 후에 해당 명령어를 수행하시기 바랍니다.
답글 남기기