2026년 10월 17일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-65131 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-65131 this PDB is not application root 는?
ORA-65131 에러는 Oracle Multitenant 환경에서 Application Container 기능을 사용할 때 발생하는 에러입니다. 이 에러는 특정 PDB(Pluggable Database)가 Application Root로 지정되어 있지 않은 상태에서, Application Root에서만 수행 가능한 DDL 작업(예: ALTER PLUGGABLE DATABASE BEGIN INSTALL, CREATE APPLICATION 등)을 해당 PDB에서 실행하려 할 때 나타납니다. 즉, Application Container 계층 구조에서 올바르지 않은 PDB를 대상으로 작업을 시도할 경우 Oracle 엔진이 이를 거부하며 발생합니다.
주요 발생 원인
1. 잘못된 PDB에 접속한 상태에서 Application 관련 DDL 실행
가장 흔한 원인으로, DBA가 Application Root PDB가 아닌 일반 PDB 또는 Application PDB(Application Seed, Application Member)에 접속한 채로 ALTER PLUGGABLE DATABASE BEGIN INSTALL 또는 CREATE APPLICATION 같은 명령을 실행할 때 발생합니다. Oracle Multitenant의 Application Container 구조에서는 Application 설치, 업그레이드, 패치 작업은 반드시 Application Root PDB에서만 수행되어야 합니다. 현재 접속된 PDB가 어떤 유형인지 확인하지 않고 작업을 진행하는 것이 이 에러의 핵심 원인입니다.
2. Application Root와 일반 PDB의 역할 혼동
Oracle 12c Release 2(12.2) 이상에서 도입된 Application Container는 CDB(Container Database) 내에 또 하나의 계층을 형성합니다. Application Root, Application Seed, Application PDB로 구성되는 이 계층 구조를 명확히 이해하지 못한 상태에서, 일반 PDB를 Application Root처럼 사용하거나, 반대로 Application PDB를 Application Root로 착각하는 경우에 발생합니다. 특히 여러 Application Container가 존재하는 복잡한 환경에서 CON_NAME이나 APPLICATION_ROOT 컬럼을 확인하지 않고 작업하면 이 에러가 빈번히 발생합니다.
3. 스크립트 자동화 시 PDB 전환 로직 오류
배포 자동화 스크립트나 마이그레이션 스크립트에서 ALTER SESSION SET CONTAINER 명령으로 대상 PDB를 전환하는 로직이 잘못 구현된 경우 발생합니다. 예를 들어, 스크립트 내에서 Application Root PDB 이름을 하드코딩하거나 환경 변수를 잘못 참조하여 실제로는 다른 PDB에 연결된 상태에서 Application 관련 DDL이 실행되는 경우입니다. 자동화된 환경일수록 에러 발생 시 원인 파악이 어렵기 때문에 사전에 PDB 유형 검증 로직을 반드시 포함해야 합니다.
해결 방법
해결책 1: 현재 접속된 PDB 유형 확인
먼저 현재 세션이 어떤 컨테이너에 있는지, 그리고 해당 컨테이너가 Application Root인지 확인합니다.
-- 현재 접속된 컨테이너 확인
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS CURRENT_CONTAINER,
SYS_CONTEXT('USERENV', 'CON_ID') AS CURRENT_CON_ID
FROM DUAL;
-- 현재 PDB가 Application Root인지 확인
SELECT NAME,
CON_ID,
APPLICATION_ROOT,
APPLICATION_PDB,
APPLICATION_SEED
FROM V$PDBS
WHERE CON_ID = SYS_CONTEXT('USERENV', 'CON_ID');
-- CDB 전체에서 Application Root 목록 조회 (CDB$ROOT에서 실행)
SELECT NAME,
CON_ID,
APPLICATION_ROOT,
APPLICATION_PDB,
APPLICATION_SEED
FROM V$PDBS
WHERE APPLICATION_ROOT = 'YES';
해결책 2: 올바른 Application Root PDB로 전환 후 작업
Application Root PDB를 확인한 뒤, 해당 PDB로 세션을 전환하거나 직접 접속하여 작업을 수행합니다.
-- CDB$ROOT(또는 DBA 권한 세션)에서 Application Root로 전환
ALTER SESSION SET CONTAINER = APP_ROOT_PDB_NAME;
-- Application Root PDB에서 Application 설치 시작
ALTER PLUGGABLE DATABASE APPLICATION myapp BEGIN INSTALL '1.0';
-- Application 관련 객체 생성 예시
CREATE TABLE app_schema.customer (
cust_id NUMBER PRIMARY KEY,
cust_name VARCHAR2(100),
created_at DATE DEFAULT SYSDATE
);
-- Application 설치 종료
ALTER PLUGGABLE DATABASE APPLICATION myapp END INSTALL '1.0';
해결책 3: 자동화 스크립트에 PDB 유형 검증 로직 추가
스크립트 실행 전에 현재 PDB가 Application Root인지 사전 검증하는 로직을 추가합니다.
-- PDB 유형 검증 후 조건부 실행 예시 (익명 블록)
DECLARE
v_app_root VARCHAR2(3);
v_con_name VARCHAR2(128);
BEGIN
SELECT APPLICATION_ROOT, NAME
INTO v_app_root, v_con_name
FROM V$PDBS
WHERE CON_ID = SYS_CONTEXT('USERENV', 'CON_ID');
IF v_app_root != 'YES' THEN
RAISE_APPLICATION_ERROR(
-20001,
'현재 PDB [' || v_con_name || '] 는 Application Root가 아닙니다. '
|| '올바른 Application Root PDB로 전환 후 재실행하세요.'
);
END IF;
DBMS_OUTPUT.PUT_LINE('Application Root 확인 완료: ' || v_con_name);
-- 이후 Application DDL 실행
END;
/
해결책 4: Application Container 구조 전체 조회
복잡한 환경에서 Application Container 전체 구조를 한눈에 파악하는 쿼리입니다.
-- Application Container 계층 구조 전체 조회
SELECT p.NAME AS PDB_NAME,
p.CON_ID,
p.APPLICATION_ROOT,
p.APPLICATION_PDB,
p.APPLICATION_SEED,
p.STATUS,
a.APP_NAME,
a.APP_VERSION,
a.APP_STATUS
FROM V$PDBS p
LEFT JOIN DBA_APPLICATIONS a
ON a.CON_ID = p.CON_ID
ORDER BY p.CON_ID;
-- Application Root에 속한 Application PDB 목록 조회
SELECT NAME,
CON_ID,
APPLICATION_ROOT_CON_ID
FROM V$PDBS
WHERE APPLICATION_PDB = 'YES'
ORDER BY APPLICATION_ROOT_CON_ID, CON_ID;
예방 방법
1. 작업 전 표준화된 PDB 유형 확인 체크리스트 운영
모든 Application Container 관련 DDL 작업 전에 반드시 현재 접속된 PDB가 Application Root인지 확인하는 체크리스트를 표준 운영 절차(SOP)에 포함시켜야 합니다. 아래와 같은 검증 쿼리를 DBA 표준 템플릿에 포함하여, 모든 배포 스크립트 최상단에 배치하는 것이 실무적으로 가장 효과적인 방법입니다.
-- 모든 Application DDL 스크립트 최상단에 배치할 검증 쿼리
-- APPLICATION_ROOT = 'YES' 가 아니면 즉시 중단
SELECT CASE
WHEN APPLICATION_ROOT = 'YES' THEN '정상: Application Root PDB 확인됨 - ' || NAME
ELSE '오류: 현재 PDB(' || NAME || ')는 Application Root가 아님. 작업 중단 요망'
END AS PDB_CHECK_RESULT
FROM V$PDBS
WHERE CON_ID = SYS_CONTEXT('USERENV', 'CON_ID');
2. Application Container 전용 접속 프로파일 및 명명 규칙 적용
Application Root PDB에는 명확한 명명 규칙(예: _APPROOT 접미사)을 적용하고, 전용 접속 문자열(TNS Alias)을 별도로 관리하여 실수로 잘못된 PDB에 접속하는 상황을 원천적으로 줄여야 합니다. 또한 Application Root PDB에 대한 접근 권한을 최소화하고, Application DDL을 수행할 수 있는 별도의 관리 계정(APP_ADMIN 등)을 운영하여 권한 분리를 명확히 하는 것이 장기적인 운영 안정성을 높이는 Best Practice입니다.
관련 에러
- ORA-65040:
operation not allowed from within a pluggable database— PDB 내에서 CDB 레벨 작업을 시도할 때 발생하며, ORA-65131과 유사하게 컨테이너 계층 혼동에서 비롯됩니다. - ORA-65011:
Pluggable database string does not exist— 존재하지 않는 PDB 이름으로 컨테이너 전환을 시도할 때 발생합니다. - ORA-65048:
error encountered when processing the DDL statement in pluggable database— Application Container DDL 처리 중 Application PDB에 전파 시 발생하는 에러로, ORA-65131과 함께 나타날 수 있습니다. - ORA-65020:
pluggable database string already open— Application Container 작업 중 PDB 상태 관련 에러로 함께 진단이 필요한 경우가 많습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.