
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
Oracle 데이터베이스에서 ORA-00054 오류는 흔히 테이블이나 인덱스에 대한 DDL (ALTER, DROP, RENAME) 작업 수행 시 발생합니다. 이는 대상 객체가 현재 다른 세션에서 사용 중이어서, 요청한 작업이 즉시 수행될 수 없다는 것을 의미합니다. 이 글에서는 ORA-00054 오류가 발생하는 구조적 이유부터, 진단 쿼리, 해결 방법, 그리고 실무에서 꼭 알아야 할 회피 전략까지 다각도로 설명합니다.
1. ORA-00054 오류란?
이 오류는 Oracle에서 다음과 같은 상황에서 발생합니다:
ALTER TABLE employees ADD (email VARCHAR2(100));
-- 또는
DROP INDEX emp_name_idx;
위 명령이 실행되었을 때 대상 테이블이나 인덱스가 현재 다른 세션에서 DML(INSERT, UPDATE, DELETE) 또는 커서 유지 중이라면, Oracle은 리소스 잠금 상태라고 판단하여 다음 오류를 반환합니다:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
2. 주요 원인과 대응 전략 요약
| 원인 | 설명 | 대응 방안 |
|---|---|---|
| 세션이 테이블 점유 | DML 실행 중인 세션이 테이블을 잠금 | 락 보유 세션 확인 후 종료 또는 대기 |
| 커서가 열린 상태 | PL/SQL에서 OPEN CURSOR 유지 중 | 커서 종료 유도 또는 세션 kill |
| NOWAIT 옵션 사용 | 잠금 상태에 대한 대기 없이 즉시 실패 | WAIT 또는 DBMS_LOCK 사용으로 대기 가능 |
| 스케줄된 배치 작업 간 충돌 | ETL 작업과 DDL이 겹칠 경우 | 작업 시간 분리 또는 동기화 |
3. 실무 사례 분석: 마트 시스템 배치 충돌
배경: 대형 마트의 POS 시스템에서 매일 3시경 통계 테이블 인덱스를 DROP 후 REBUILD하는 스크립트가 오류 발생.
에러 로그:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
원인 분석:
- 고객 포인트 적립 프로세스가 아직 종료되지 않은 상태에서 배치 실행
- 리소스를 잠근 상태에서 DDL 시도 → 실패
해결:
- 락 보유 세션 확인 및 종료 유도
- 스케줄 재조정 (DDL 30분 후로 지연)
- 스크립트에서
FORCE또는WAIT옵션 도입
4. 잠금 세션 확인 SQL
잠금 보유 세션 찾기
SELECT l.session_id, s.username, s.osuser, s.program, l.locked_mode,
s.machine, s.status
FROM v$locked_object l
JOIN dba_objects o ON l.object_id = o.object_id
JOIN v$session s ON l.session_id = s.sid
WHERE o.object_name = 'EMPLOYEES';
특정 SID 세션 종료
ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;
-- 예: ALTER SYSTEM KILL SESSION '120,54879' IMMEDIATE;
5. 해결 방법 요약
| 방법 | 설명 | 적용 주의사항 |
|---|---|---|
| 세션 강제 종료 | 락 보유 세션 종료 | 업무 영향 가능성 있음 |
| DDL 스케줄 조정 | 비업무 시간으로 이동 | 충돌 방지 가능 |
| DBMS_LOCK 사용 | 사용자 정의 잠금 컨트롤 | PL/SQL 내 구현 필요 |
| WAIT 옵션 활용 | DDL 스크립트에서 일정 시간 대기 설정 | 10g 이상부터 제한적 사용 가능 |
6. 실무 팁: 자동 회피 로직 구현
배치 스크립트 또는 DBA 관리 툴에서 다음과 같은 방식으로 자동화하는 것이 좋습니다:
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE employees ADD (temp_flag NUMBER)';
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('리소스가 바쁨. 5분 후 재시도');
DBMS_LOCK.SLEEP(300);
-- 재시도 로직 추가 가능
END;
이와 같은 방식은 시스템 운영 자동화에서 안정성을 향상시키는 데 크게 기여합니다.
7. 예방 전략
- 업무 시간 외의 유지보수 시간 확보
- 자동화 스크립트에 LOCK 대기 또는 회피 로직 포함
- 락 보유 가능성이 있는 세션에 대한 사전 모니터링
- PL/SQL 커서 종료 여부 주기적 점검
8. 결론
ORA-00054 오류는 단순한 시스템 오류가 아니라, 리소스 관리와 트랜잭션 동시성 설계에 대한 메시지입니다. 실무에서는 이 오류를 반복적으로 경험하게 되며, DDL 시점 관리와 커넥션 제어, 자동화된 락 회피 전략이 필수적입니다. 이 글을 통해 ORA-00054의 발생 원리를 깊이 이해하고, 실무 대응력을 한층 끌어올릴 수 있기를 바랍니다.
출처
- Oracle® Database Error Messages 19c
- Oracle DBA Performance Tuning Guide
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] ORA-01013 오류 분석과 대처 전략 : 쿼리 취소 시나리오의 모든 것 (0) | 2025.07.28 |
|---|---|
| [ORACLE] ORA-00404 오류 분석과 해결 : 초기화 파라미터 관련 문제의 본질 (0) | 2025.07.28 |
| [ORACLE] ORA-00060 오류 완전 분석 : 데드락 감지와 회피 전략 (0) | 2025.07.28 |
| [ORACLE] ORA-02292 오류 완전 정복 : 자식 테이블 참조로 인한 삭제 실패의 모든 것 (0) | 2025.07.28 |
| [ORACLE] ORA-00020 오류 해결 가이드 : 세션 수 초과의 원인과 진단 전략 (0) | 2025.07.28 |