ORA-04021: timeout occurred while waiting to lock object (객체 락 대기 중 타임아웃 발생)
Oracle의미
객체(패키지, 프로시저, 타입 등)에 대한 library cache lock/pin을 획득하려고 기다리는 중 타임아웃이 발생했다. 보통 다른 세션이 실행 중이거나 락을 건 PL/SQL 객체를 컴파일하거나 변경하려 할 때 발생한다.
원인
변경/컴파일하려는 객체가 다른 세션에서 활발히 실행 중이거나 다른 DDL에 의해 잠겨 있어 배타적 library cache lock을 획득할 수 없다. 장시간 실행되는 프로시저 호출이나 멈춘 세션이 락을 보유하고 있을 수 있다.
해결 방법
객체를 잠근 세션을 찾는다: SELECT * FROM dba_kgllock WHERE kgllkhdl IN (SELECT p1raw FROM v$session WHERE event LIKE 'library cache%'); 또는 v$access와 v$session으로 객체를 사용하는 세션을 식별한다. 워크로드가 낮은 유지보수 시간에 DDL/컴파일을 재시도한다. 필요하면 세션을 안전하게 종료한다. 애플리케이션을 잠시 중지하면 락을 획득하기 쉬워진다.
같은 데이터베이스의 다른 항목
- ORA-29913error in executing ODCIEXTTABLEOPEN callout (ODCIEXTTABLEOPEN callout 실행 오류)
- ORA-19804cannot reclaim N bytes disk space from M bytes limit (M바이트 한도에서 N바이트 디스크 공간을 회수할 수 없음)
- ORA-00494enqueue held for too long by 'inst N, osid M' (enqueue가 너무 오래 보유됨)
- ORA-04061existing state of package/procedure has been invalidated (패키지/프로시저의 기존 상태가 무효화됨)
- ORA-01466unable to read data - table definition has changed (데이터를 읽을 수 없음 - 테이블 정의 변경됨)
- ORA-08176consistent read failure; rollback data not available (consistent read 실패. rollback 데이터 없음)
- ORA-00020maximum number of processes (N) exceeded (최대 프로세스 수(N) 초과)