2026년 10월 18일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-65139 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-65139 the application is not in the expected state 는?
ORA-65139 에러는 Oracle Multitenant 환경(CDB/PDB 아키텍처)에서 애플리케이션 컨테이너(Application Container) 또는 애플리케이션 PDB의 상태가 특정 작업을 수행하기 위한 전제 조건을 충족하지 못할 때 발생합니다. 주로 Application Root, Application PDB, 또는 Application Seed에서 애플리케이션 설치(Install), 업그레이드(Upgrade), 패치(Patch), 또는 언인스톨(Uninstall) 작업 도중 잘못된 순서로 명령이 실행되거나 이전 작업이 정상적으로 완료되지 않은 상태에서 후속 작업을 시도할 때 이 에러가 트리거됩니다. Oracle 12c Release 2 이후 도입된 Application Container 기능은 엄격한 상태 머신(State Machine)을 기반으로 동작하므로, 각 단계의 순서를 정확히 지키지 않으면 이 에러를 마주치게 됩니다.
주요 발생 원인
- 애플리케이션 BEGIN/END 블록 순서 불일치 또는 누락
Oracle Application Container에서 애플리케이션을 설치하거나 업그레이드할 때는 반드시 ALTER PLUGGABLE DATABASE APPLICATION 구문으로 시작하고, 작업 완료 후 END INSTALL/UPGRADE 구문으로 마무리해야 합니다. 이 BEGIN-END 블록을 빠뜨리거나, END 없이 세션이 종료되거나, 이전 작업이 비정상 종료된 상태에서 새 작업을 시도하면 애플리케이션이 예상치 못한 상태(unexpected state)에 머물게 되어 ORA-65139가 발생합니다. 특히 DBA가 스크립트 오류나 세션 단절(session disconnect) 후 재시도할 때 이 원인이 가장 빈번하게 나타납니다.
- 이전 애플리케이션 작업의 비정상 종료 또는 롤백 미완료
애플리케이션 설치/업그레이드 도중 네트워크 단절, 세션 킬(session kill), 또는 내부 오류로 인해 작업이 중단되면 Application Root의 내부 딕셔너리 테이블(DBA_APPLICATIONS, DBA_APP_VERSIONS)에 불완전한 상태 레코드가 남게 됩니다. 이 상태에서 다시 동일한 작업을 시도하면 Oracle은 이미 진행 중인(또는 실패한) 작업 상태를 감지하고 ORA-65139를 반환합니다. 이를 해결하지 않고 계속 작업을 시도하면 딕셔너리 데이터 불일치가 심화될 수 있습니다.
- 잘못된 컨테이너(Container)에서 명령 실행
Application Container 관련 DDL 명령은 반드시 올바른 컨테이너 컨텍스트(Application Root)에서 실행해야 합니다. CDB Root나 일반 PDB에서 Application 관련 명령을 실행하거나, Application PDB에서 Application Root 전용 명령을 실행할 경우 컨테이너의 상태가 해당 작업에 적합하지 않아 ORA-65139가 발생합니다. ALTER SESSION SET CONTAINER 명령을 통해 컨텍스트를 명확히 설정하지 않고 작업하는 것이 이 원인의 핵심입니다.
해결 방법
원인 1 해결: 현재 애플리케이션 상태 확인 후 정상화
먼저 Application Root에 접속하여 현재 애플리케이션의 상태를 확인합니다.
-- Application Root로 컨테이너 전환
ALTER SESSION SET CONTAINER = my_app_root;
-- 현재 애플리케이션 상태 조회
SELECT app_name, app_version, app_status
FROM dba_applications
ORDER BY app_name;
-- 애플리케이션 버전 상세 이력 조회
SELECT app_name, app_version, app_status, begin_scn, end_scn
FROM dba_app_versions
ORDER BY app_name, begin_scn;
만약 상태가 PATCH IN PROGRESS, UPGRADE IN PROGRESS, INSTALL IN PROGRESS 등으로 멈춰 있다면, 해당 작업을 강제로 종료(END)하거나 롤백합니다.
-- 비정상 상태의 설치 작업 강제 종료 (END로 마무리)
ALTER PLUGGABLE DATABASE APPLICATION my_app END INSTALL '1.0';
-- 또는 업그레이드 강제 종료
ALTER PLUGGABLE DATABASE APPLICATION my_app END UPGRADE '1.0' TO '2.0';
-- 상태 재확인
SELECT app_name, app_version, app_status
FROM dba_applications
WHERE app_name = 'MY_APP';
원인 2 해결: 비정상 종료된 작업 정리 후 재시도
이전 작업이 롤백되지 않은 경우, 불완전한 버전 레코드를 정리하고 새로 시작합니다.
-- Application Root 접속
ALTER SESSION SET CONTAINER = my_app_root;
-- 실패한 상태 확인
SELECT app_name, app_version, app_status
FROM dba_app_versions
WHERE app_status NOT IN ('NORMAL', 'PATCH APPLIED');
-- 이전 실패한 설치 취소(UNINSTALL)
ALTER PLUGGABLE DATABASE APPLICATION my_app UNINSTALL;
-- 애플리케이션 상태 초기화 후 재설치 시작
ALTER PLUGGABLE DATABASE APPLICATION my_app BEGIN INSTALL '1.0';
-- 필요한 DDL/DML 수행
CREATE TABLE app_schema.my_table (
id NUMBER PRIMARY KEY,
name VARCHAR2(100)
);
-- 설치 완료
ALTER PLUGGABLE DATABASE APPLICATION my_app END INSTALL '1.0';
-- 결과 확인
SELECT app_name, app_version, app_status
FROM dba_applications
WHERE app_name = 'MY_APP';
원인 3 해결: 올바른 컨테이너 컨텍스트 확인 및 전환
-- 현재 접속된 컨테이너 확인
SELECT sys_context('USERENV', 'CON_NAME') AS current_container,
sys_context('USERENV', 'CON_ID') AS container_id
FROM dual;
-- CDB 전체 컨테이너 목록 및 타입 확인
SELECT con_id, name, open_mode, application_root,
application_pdb, application_seed
FROM v$pdbs
ORDER BY con_id;
-- Application Root로 정확히 전환
ALTER SESSION SET CONTAINER = my_app_root;
-- 전환 후 상태 재확인
SELECT sys_context('USERENV', 'CON_NAME') AS current_container FROM dual;
-- 올바른 컨텍스트에서 애플리케이션 작업 수행
ALTER PLUGGABLE DATABASE APPLICATION my_app BEGIN UPGRADE '1.0' TO '2.0';
-- 업그레이드 스크립트 실행
ALTER TABLE app_schema.my_table ADD (description VARCHAR2(500));
CREATE INDEX app_schema.idx_my_table_name ON app_schema.my_table(name);
-- 업그레이드 완료
ALTER PLUGGABLE DATABASE APPLICATION my_app END UPGRADE TO '2.0';
예방 방법
- 표준화된 애플리케이션 배포 스크립트 작성 및 BEGIN/END 블록 필수 포함
모든 Application Container 관련 배포 작업은 BEGIN-END 블록을 명시적으로 포함하는 표준 스크립트로 관리해야 합니다. 스크립트 내에 예외 처리(EXCEPTION block) 또는 쉘 스크립트 레벨의 에러 핸들링을 추가하여, 중간에 실패하더라도 END 블록이 실행되거나 DBA에게 알림이 가도록 구성하십시오. 또한 배포 전후 DBA_APPLICATIONS와 DBA_APP_VERSIONS를 조회하는 검증 단계를 스크립트에 포함시키는 것을 권장합니다.
- 배포 전 애플리케이션 상태 사전 점검 자동화
CI/CD 파이프라인 또는 배포 자동화 도구에 애플리케이션 상태 사전 점검 쿼리를 통합하여, 상태가 NORMAL이 아닌 경우 배포를 자동으로 중단하고 DBA에게 알림을 보내는 체계를 구축하십시오. 이를 통해 불완전한 상태에서의 연속 배포 시도로 인한 딕셔너리 오염을 원천 차단할 수 있습니다.
관련 에러
- ORA-65140:
invalid application name— 애플리케이션 이름이 딕셔너리에 존재하지 않을 때 발생하며, ORA-65139와 함께 나타나는 경우가 많습니다. - ORA-65141:
application version already exists— 동일 버전으로 재설치 시도 시 발생하며, 비정상 종료 후 재시도할 때 ORA-65139와 함께 연쇄 발생할 수 있습니다. - ORA-65048:
error encountered when switching to pluggable database— 컨테이너 전환 실패 시 발생하며, 잘못된 컨테이너에서 작업하다가 ORA-65139를 유발하는 선행 에러가 될 수 있습니다. - ORA-65011:
pluggable database does not exist— PDB 이름 오류로 인한 컨테이너 전환 실패 시 발생하며, ORA-65139의 간접적 원인이 될 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.