2026년 08월 19일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-04021 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-04021 timeout occurred while waiting to lock object 는?
ORA-04021 에러는 Oracle 데이터베이스에서 특정 객체(Object)에 대한 잠금(Lock)을 획득하기 위해 대기하던 중 설정된 타임아웃 시간이 초과되었을 때 발생하는 에러입니다. 주로 DDL(Data Definition Language) 작업, 예를 들어 패키지(Package), 프로시저(Procedure), 트리거(Trigger), 테이블(Table) 등의 컴파일 또는 변경 작업을 수행할 때, 해당 객체가 다른 세션에 의해 이미 사용 중인 경우에 발생합니다. 이 에러는 운영 환경에서 애플리케이션이 실행 중인 상태에서 무분별하게 DDL 작업을 시도할 때 자주 목격되며, 시스템 가용성에 직접적인 영향을 줄 수 있는 중요한 에러입니다.
주요 발생 원인
1. 활성 세션이 해당 객체를 실행 중인 상태에서 DDL 수행
가장 흔한 원인으로, 다른 세션에서 특정 패키지나 프로시저를 현재 실행 중인 상태에서 해당 객체를 재컴파일(Recompile)하거나 변경(ALTER)하려 할 때 발생합니다. Oracle은 DDL 작업을 수행하기 위해 해당 객체에 독점 잠금(Exclusive Lock)을 필요로 하는데, 다른 세션이 해당 객체를 점유하고 있으면 잠금 획득에 실패하고 결국 타임아웃이 발생합니다.
2. 장시간 실행 중인 트랜잭션 또는 커밋되지 않은 DML 작업
특정 테이블에 대해 INSERT, UPDATE, DELETE와 같은 DML 작업을 수행한 후 COMMIT 또는 ROLLBACK 없이 트랜잭션이 열려 있는 상태에서, 해당 테이블에 대한 DDL(예: ALTER TABLE, DROP TABLE) 작업을 시도할 경우에도 이 에러가 발생합니다. 장시간 실행되는 배치 작업이나 개발자가 SQL*Plus 등에서 DML 후 커밋을 잊은 경우가 대표적인 사례입니다.
3. DDL_LOCK_TIMEOUT 파라미터 설정값 부족
Oracle 11g 이후부터는 DDL_LOCK_TIMEOUT 파라미터를 통해 DDL이 잠금 획득을 기다리는 최대 시간을 설정할 수 있습니다. 이 값이 기본값인 0으로 설정되어 있으면, DDL은 즉시 잠금 획득을 시도하고 실패 시 바로 ORA-04021 에러를 발생시킵니다. 운영 환경에서 이 파라미터가 적절히 설정되지 않은 경우, 잠깐의 객체 사용도 DDL 실패로 이어질 수 있습니다.
해결 방법
원인 1 해결: 활성 세션 확인 및 종료
먼저 해당 객체를 사용 중인 세션을 찾아야 합니다.
-- 특정 객체를 사용 중인 세션 조회
SELECT s.sid,
s.serial#,
s.username,
s.status,
s.program,
s.machine,
o.object_name,
o.object_type
FROM v$session s,
v$access a,
dba_objects o
WHERE s.sid = a.sid
AND a.object = o.object_name
AND o.object_name = UPPER('YOUR_OBJECT_NAME') -- 객체명 입력
AND s.status = 'ACTIVE';
-- 해당 세션 강제 종료 (DBA 권한 필요)
-- sid와 serial# 값을 위 조회 결과에서 확인 후 입력
ALTER SYSTEM KILL SESSION '123,456' IMMEDIATE;
세션 종료 후 DDL 작업을 재시도합니다. 운영 환경에서는 반드시 해당 세션의 업무 영향도를 확인한 후 Kill 여부를 결정해야 합니다.
원인 2 해결: 미완료 트랜잭션 확인 및 정리
-- 커밋되지 않은 트랜잭션을 가진 세션 조회
SELECT s.sid,
s.serial#,
s.username,
s.status,
t.used_ublk,
t.used_urec,
s.logon_time,
s.last_call_et AS idle_seconds
FROM v$session s,
v$transaction t
WHERE s.taddr = t.addr
ORDER BY t.used_ublk DESC;
-- 특정 세션의 현재 실행 중인 SQL 확인
SELECT sql_text
FROM v$sqlarea
WHERE sql_id = (
SELECT sql_id
FROM v$session
WHERE sid = 123 -- 확인할 SID 입력
);
-- 트랜잭션 정리 후 세션 종료
ALTER SYSTEM KILL SESSION '123,456' IMMEDIATE;
원인 3 해결: DDL_LOCK_TIMEOUT 파라미터 조정
-- 현재 DDL_LOCK_TIMEOUT 설정값 확인
SHOW PARAMETER DDL_LOCK_TIMEOUT;
-- 세션 레벨에서 타임아웃 설정 (초 단위, 예: 30초)
ALTER SESSION SET DDL_LOCK_TIMEOUT = 30;
-- 시스템 전체 레벨에서 설정 (DBA 권한 필요)
ALTER SYSTEM SET DDL_LOCK_TIMEOUT = 30 SCOPE = BOTH;
-- DDL_LOCK_TIMEOUT 설정 후 재컴파일 예시
ALTER SESSION SET DDL_LOCK_TIMEOUT = 60;
ALTER PACKAGE your_package_name COMPILE;
-- 또는
ALTER PROCEDURE your_procedure_name COMPILE;
추가: Lock 대기 상태 전체 모니터링
-- Lock 대기 세션 전체 조회
SELECT l.sid,
l.type,
l.lmode,
l.request,
l.ctime,
s.username,
s.status,
s.program
FROM v$lock l,
v$session s
WHERE l.sid = s.sid
AND l.request > 0
ORDER BY l.ctime DESC;
-- Blocking Session 확인
SELECT blocking_session,
sid,
serial#,
wait_class,
seconds_in_wait
FROM v$session
WHERE blocking_session IS NOT NULL
ORDER BY seconds_in_wait DESC;
예방 방법
1. DDL 작업 전 사전 점검 절차 수립 및 유지보수 윈도우 활용
운영 환경에서 패키지, 프로시저, 테이블 등의 DDL 작업은 반드시 서비스 트래픽이 최소화되는 유지보수 윈도우(Maintenance Window) 시간대에 수행해야 합니다. DDL 작업 전에는 반드시 위에서 소개한 v$access, v$session, v$lock 뷰를 활용하여 해당 객체를 사용 중인 세션이 없는지 사전 점검하는 절차를 표준화하고, 이를 운영 지침(Runbook)에 명문화하여 모든 DBA와 개발자가 준수하도록 해야 합니다.
2. DDL_LOCK_TIMEOUT 적절한 설정 및 애플리케이션 Connection Pool 관리
DDL_LOCK_TIMEOUT 파라미터를 환경에 맞게 적절한 값(예: 30~60초)으로 설정하여 일시적인 객체 사용 상황에서도 DDL이 일정 시간 대기 후 재시도할 수 있도록 합니다. 또한 애플리케이션의 Connection Pool 설정을 검토하여 불필요하게 장시간 유지되는 커넥션이나 미완료 트랜잭션이 없도록 관리하고, 주기적으로 Idle 세션을 정리하는 프로파일(Profile) 또는 Resource Manager 정책을 적용하는 것을 권장합니다.
관련 에러
- ORA-00054:
resource busy and acquire with NOWAIT specified or timeout expired— DDL 또는SELECT FOR UPDATE NOWAIT시도 시 즉시 잠금 획득 실패 시 발생하며, ORA-04021과 유사한 상황에서 발생합니다. - ORA-04020:
deadlock detected while trying to lock object— 두 세션이 서로 상대방의 객체 잠금을 기다리며 교착 상태(Deadlock)가 발생했을 때 나타나는 에러로, ORA-04021과 함께 Lock 관련 에러군에 속합니다. - ORA-00060:
deadlock detected while waiting for resource— 일반적인 DML 수준의 데드락 에러로, ORA-04021과 함께 Lock 경합 문제를 진단할 때 함께 확인해야 하는 에러입니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.