Oracle ORA-65009 오류 원인과 해결 방법 완벽 가이드

ORA-65009
2026년 10월 12일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-65009 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-65009 operation is not allowed in pluggable database 는?

ORA-65009 에러는 Oracle Multitenant 아키텍처 환경에서 PDB(Pluggable Database)에 접속한 상태로, CDB(Container Database) 수준에서만 허용되는 특정 작업을 시도할 때 발생합니다. Oracle 12c 이후 도입된 Multitenant 구조에서는 CDB와 PDB의 역할이 명확히 구분되어 있으며, 일부 DDL, 관리 명령, 시스템 파라미터 변경 등은 반드시 CDB$ROOT 또는 CDB 레벨에서만 수행해야 합니다. 이 에러는 주로 DBA가 PDB 세션에서 CDB 전용 작업을 실행하거나, 권한 범위를 혼동할 때 빈번하게 발생하며 운영 환경에서 상당한 혼란을 유발할 수 있습니다.


주요 발생 원인

1. PDB 세션에서 CDB 전용 파라미터(SPFILE) 변경 시도

Oracle Multitenant 환경에서 일부 초기화 파라미터는 CDB 레벨에서만 설정이 가능합니다. PDB에 접속한 상태에서 ALTER SYSTEM SET 명령으로 CDB 전용 파라미터를 변경하려 하면 ORA-65009가 발생합니다. 예를 들어, ENABLE_PLUGGABLE_DATABASE, DB_RECOVERY_FILE_DEST 등 일부 파라미터는 PDB 컨텍스트에서 수정이 제한되어 있습니다.

2. PDB 내에서 CDB 전용 사용자(Common User) 또는 롤(Common Role) 생성 시도

Common User는 CDB$ROOT에서만 생성할 수 있으며, 이름이 반드시 C## 접두사를 가져야 합니다. PDB에 접속한 상태에서 Common User를 생성하거나 Common Role을 부여하려 하면 ORA-65009 에러가 발생합니다. 이는 Multitenant 보안 모델의 핵심 제약 중 하나로, 컨테이너 간 사용자 관리를 명확히 구분하기 위한 설계입니다.

3. PDB에서 CDB 전용 뷰 또는 딕셔너리 객체에 대한 DDL 조작

CDB_* 계열의 뷰나 일부 시스템 레벨의 딕셔너리 객체, 그리고 Undo Tablespace, Temp Tablespace 등 CDB 공유 리소스에 대한 특정 DDL은 PDB 컨텍스트에서 허용되지 않습니다. DBA가 PDB에서 CREATE UNDO TABLESPACE 등의 명령을 실행하거나, CDB 전용 관리 뷰를 직접 조작하려 할 때 이 에러가 자주 발생합니다. 특히 타 DBMS에서 Oracle로 이관한 경험이 있는 DBA가 Multitenant 개념 없이 작업할 때 실수하기 쉬운 부분입니다.


해결 방법

원인 1 해결: CDB$ROOT로 전환 후 파라미터 변경

PDB 세션에서 CDB 전용 파라미터를 변경해야 한다면, SYS 또는 SYSDBA 권한으로 CDB$ROOT에 접속한 후 작업을 수행해야 합니다.

-- 현재 컨테이너 확인
SHOW CON_NAME;

-- CDB$ROOT로 전환
ALTER SESSION SET CONTAINER = CDB$ROOT;

-- CDB 전용 파라미터 변경 (예: DB_RECOVERY_FILE_DEST)
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '/u01/app/oracle/fra' SCOPE=BOTH;

-- 특정 PDB에만 적용 가능한 파라미터는 PDB로 다시 전환 후 수행
ALTER SESSION SET CONTAINER = ORCLPDB;
ALTER SYSTEM SET OPEN_CURSORS = 500 SCOPE=BOTH;

> Note: 파라미터가 PDB 레벨에서 설정 가능한지 여부는 V$PARAMETER 뷰의 ISPDB_MODIFIABLE 컬럼으로 확인할 수 있습니다.

-- PDB에서 변경 가능한 파라미터 확인
SELECT NAME, ISPDB_MODIFIABLE, VALUE
FROM   V$PARAMETER
WHERE  ISPDB_MODIFIABLE = 'TRUE'
ORDER  BY NAME;

원인 2 해결: Common User / Local User 생성 위치 구분

-- CDB$ROOT로 전환 후 Common User 생성 (C## 접두사 필수)
ALTER SESSION SET CONTAINER = CDB$ROOT;

CREATE USER C##DBA_ADMIN
  IDENTIFIED BY "SecurePass#2024"
  CONTAINER = ALL;

GRANT DBA TO C##DBA_ADMIN CONTAINER = ALL;

-- PDB에서는 Local User만 생성 가능
ALTER SESSION SET CONTAINER = ORCLPDB;

CREATE USER app_user
  IDENTIFIED BY "AppPass#2024";

GRANT CONNECT, RESOURCE TO app_user;

-- 현재 컨테이너의 사용자 목록 확인
SELECT USERNAME, COMMON, CON_ID
FROM   CDB_USERS
WHERE  CON_ID = SYS_CONTEXT('USERENV', 'CON_ID');

원인 3 해결: CDB 전용 DDL은 CDB$ROOT에서 수행

-- CDB$ROOT에서 Undo Tablespace 생성 (CDB 전용)
ALTER SESSION SET CONTAINER = CDB$ROOT;

CREATE UNDO TABLESPACE undotbs2
  DATAFILE '/u01/app/oracle/oradata/ORCL/undotbs02.dbf'
  SIZE 500M AUTOEXTEND ON NEXT 50M MAXSIZE 2G;

ALTER SYSTEM SET UNDO_TABLESPACE = UNDOTBS2;

-- PDB 전용 Tablespace는 해당 PDB에서 생성
ALTER SESSION SET CONTAINER = ORCLPDB;

CREATE TABLESPACE app_data
  DATAFILE '/u01/app/oracle/oradata/ORCLPDB/app_data01.dbf'
  SIZE 200M AUTOEXTEND ON NEXT 20M MAXSIZE 1G;

-- CDB 전체 Tablespace 현황 확인
SELECT CON_ID, TABLESPACE_NAME, STATUS
FROM   CDB_TABLESPACES
ORDER  BY CON_ID, TABLESPACE_NAME;

에러 발생 컨테이너 확인 및 전환 스크립트

-- 현재 접속 컨테이너 및 세션 정보 확인
SELECT SYS_CONTEXT('USERENV','CON_NAME')   AS current_container,
       SYS_CONTEXT('USERENV','CON_ID')     AS container_id,
       SYS_CONTEXT('USERENV','SESSION_USER') AS session_user,
       SYS_CONTEXT('USERENV','ISDBA')      AS is_dba
FROM   DUAL;

-- 사용 가능한 PDB 목록 확인 (CDB$ROOT에서 실행)
ALTER SESSION SET CONTAINER = CDB$ROOT;

SELECT CON_ID, NAME, OPEN_MODE, RESTRICTED
FROM   V$PDBS
ORDER  BY CON_ID;

예방 방법

1. 작업 전 컨테이너 확인 절차를 표준화하라

모든 DBA 운영 스크립트의 첫 줄에 현재 컨테이너를 확인하는 구문을 의무적으로 포함하는 코딩 표준을 수립해야 합니다. 특히 CDB와 PDB를 넘나드는 배치 작업이나 마이그레이션 스크립트에서는 SHOW CON_NAME 또는 SYS_CONTEXT('USERENV','CON_NAME') 확인 로직을 삽입하여 의도치 않은 컨테이너에서 작업이 실행되는 것을 사전에 방지해야 합니다. DBA 팀 내 Multitenant 아키텍처에 대한 정기적인 교육도 병행하는 것이 좋습니다.

2. 권한 및 역할 설계 시 Common/Local 분리 원칙을 명확히 적용하라

CDB 전체에서 관리 권한이 필요한 계정은 Common User(C## 접두사)로, 특정 PDB 내에서만 사용하는 계정은 Local User로 명확히 분리하여 설계해야 합니다. 또한 운영 환경에서 일반 사용자가 CDB$ROOT에 직접 접속하지 못하도록 접속 제어 정책을 수립하고, AUDIT 기능을 활성화하여 컨테이너 전환 이력을 모니터링하는 체계를 갖추는 것이 장기적으로 운영 안정성을 높이는 데 큰 도움이 됩니다.


관련 에러

  • ORA-65040: operation not allowed from within a pluggable database — ORA-65009와 유사하게 PDB 내에서 CDB 전용 작업을 시도할 때 발생하며, 주로 특정 STARTUP/SHUTDOWN 명령이나 CDB 레벨 관리 작업과 관련됩니다.
  • ORA-65049: creation of local users or roles is not allowed in CDB$ROOT — Common User/Role을 생성할 때 C## 접두사 누락 또는 CDB$ROOT에서 Local User 생성 시도 시 발생합니다.
  • ORA-65050: common users and roles must have a common object — Common User에게 Local 객체를 할당하려 할 때 발생하며, Multitenant 보안 모델 이해 부족에서 기인합니다.
  • ORA-01031: insufficient privileges — 컨테이너 전환에 필요한 권한(SET CONTAINER 권한) 미보유 시 함께 발생할 수 있습니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기