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

ORA-65066
2026년 10월 15일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-65066 The specified changes cannot be applied to all containers 는?

ORA-65066 에러는 Oracle Multitenant 아키텍처(CDB/PDB 환경)에서 CDB 전체 컨테이너에 적용되어야 하는 변경 작업이 특정 조건을 만족하지 못해 실행이 거부될 때 발생합니다. 주로 공통 사용자(Common User), 공통 롤(Common Role), 공통 프로파일(Common Profile) 또는 시스템 파라미터를 변경할 때 CONTAINER=ALL 구문을 잘못 사용하거나 필요한 권한이 없을 경우 이 에러가 트리거됩니다. 이 에러는 Oracle 12c 이후 CDB 환경이 도입되면서 새롭게 등장한 에러로, 멀티테넌트 운영 환경에서 DBA가 자주 마주치는 대표적인 에러 중 하나입니다.


주요 발생 원인

1. 공통 사용자(Common User) 생성 또는 변경 시 CONTAINER=ALL 미지정 또는 잘못된 연결 세션

CDB 환경에서 공통 사용자를 생성하거나 수정할 때는 반드시 CDB$ROOT에 접속한 상태에서 CONTAINER=ALL 옵션을 명시해야 합니다. 만약 PDB에 접속한 상태에서 공통 사용자 관련 DDL을 실행하거나, CDB$ROOT에 접속했더라도 CONTAINER=ALL을 누락하면 이 에러가 발생합니다. 또한 공통 사용자명은 반드시 C## 접두어로 시작해야 하며, 이를 어길 경우에도 동일 에러가 발생할 수 있습니다.

2. 공통 롤(Common Role) 또는 공통 프로파일(Common Profile) 관련 권한 부여/취소 시 컨테이너 범위 불일치

공통 롤이나 공통 프로파일에 대한 GRANT/REVOKE 작업 시 CONTAINER=ALL 절을 올바르게 사용하지 않으면 에러가 발생합니다. CDB 전체에 적용되는 권한 변경은 반드시 CDB$ROOT에서 수행되어야 하며, 특정 PDB에서 시도할 경우 Oracle은 변경 범위가 모든 컨테이너에 미칠 수 없다고 판단하여 ORA-65066을 반환합니다. 특히 DBA 롤처럼 시스템 공통 롤에 대한 권한 조작 시 이 규칙이 엄격하게 적용됩니다.

3. CDB 레벨 파라미터 변경 시 현재 접속 컨테이너가 CDB$ROOT가 아닌 경우

일부 시스템 초기화 파라미터는 CDB 전체에 영향을 미치며, 이를 변경하려면 반드시 CDB$ROOT 컨테이너에서 ALTER SYSTEM 명령을 수행해야 합니다. PDB에 접속한 상태에서 CONTAINER=ALL이 필요한 파라미터를 변경하려 할 경우 Oracle은 해당 변경이 모든 컨테이너에 적용될 수 없다고 판단하여 ORA-65066을 발생시킵니다. 이는 특히 운영 자동화 스크립트나 DBA 도구에서 현재 세션의 컨테이너 상태를 확인하지 않고 실행할 때 자주 발생합니다.


해결 방법

원인 1 해결: 올바른 컨테이너에서 공통 사용자 생성

먼저 현재 접속 컨테이너를 확인하고, CDB$ROOT로 전환한 후 작업을 수행합니다.

-- 현재 컨테이너 확인
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS current_container FROM DUAL;

-- CDB$ROOT로 전환 (SQL*Plus 또는 SQL Developer)
ALTER SESSION SET CONTAINER = CDB$ROOT;

-- 공통 사용자 생성 (C## 접두어 필수, CONTAINER=ALL 명시)
CREATE USER C##APP_ADMIN IDENTIFIED BY "SecurePassword123!"
  DEFAULT TABLESPACE USERS
  TEMPORARY TABLESPACE TEMP
  CONTAINER = ALL;

-- 공통 사용자에게 공통 롤 부여
GRANT CREATE SESSION, CREATE TABLE TO C##APP_ADMIN CONTAINER = ALL;

-- 공통 사용자 속성 변경 시에도 동일하게 적용
ALTER USER C##APP_ADMIN
  PROFILE C##DEFAULT_PROFILE
  CONTAINER = ALL;

원인 2 해결: 공통 롤 권한 부여 및 취소

-- CDB$ROOT에서 공통 롤 생성
ALTER SESSION SET CONTAINER = CDB$ROOT;

CREATE ROLE C##COMMON_ROLE CONTAINER = ALL;

-- 공통 롤에 시스템 권한 부여
GRANT CREATE SESSION TO C##COMMON_ROLE CONTAINER = ALL;
GRANT CREATE TABLE TO C##COMMON_ROLE CONTAINER = ALL;

-- 공통 사용자에게 공통 롤 부여
GRANT C##COMMON_ROLE TO C##APP_ADMIN CONTAINER = ALL;

-- 잘못된 방법 (PDB에서 실행 시 ORA-65066 발생)
-- ALTER SESSION SET CONTAINER = PDB1;  -- 이 상태에서 아래 실행 시 에러
-- GRANT C##COMMON_ROLE TO C##APP_ADMIN CONTAINER = ALL;  -- ORA-65066 발생!

-- 공통 프로파일 생성 예시
CREATE PROFILE C##SECURE_PROFILE LIMIT
  FAILED_LOGIN_ATTEMPTS 5
  PASSWORD_LOCK_TIME 1/24
  PASSWORD_LIFE_TIME 90
  CONTAINER = ALL;

원인 3 해결: CDB 레벨 파라미터 변경

-- 현재 컨테이너 및 파라미터 확인
SELECT NAME, VALUE, CON_ID
FROM V$PARAMETER
WHERE NAME IN ('db_securefile', 'enable_pluggable_database')
ORDER BY CON_ID;

-- 반드시 CDB$ROOT에서 실행
ALTER SESSION SET CONTAINER = CDB$ROOT;

-- CDB 전체에 적용되는 파라미터 변경
ALTER SYSTEM SET db_securefile = 'ALWAYS' CONTAINER = ALL;

-- 특정 PDB에만 파라미터 변경 (올바른 방법)
ALTER SESSION SET CONTAINER = PDB1;
ALTER SYSTEM SET db_securefile = 'ALWAYS';  -- CONTAINER=ALL 없이 현재 PDB에만 적용

-- 에러 발생 여부 사전 진단 쿼리
SELECT CON_ID, NAME, OPEN_MODE
FROM V$PDBS
WHERE OPEN_MODE NOT IN ('READ WRITE', 'MOUNTED')
ORDER BY CON_ID;
-- RESTRICTED 모드 등 비정상 PDB가 있으면 CONTAINER=ALL 적용 시 에러 가능

컨테이너 상태 종합 점검 스크립트

-- CDB 환경 전체 상태 확인
SELECT 
    CON_ID,
    NAME,
    OPEN_MODE,
    RESTRICTED,
    STATUS
FROM V$PDBS
ORDER BY CON_ID;

-- 공통 사용자 목록 확인
SELECT USERNAME, COMMON, CON_ID
FROM CDB_USERS
WHERE COMMON = 'YES'
ORDER BY USERNAME;

-- 공통 롤 목록 확인
SELECT ROLE, COMMON, CON_ID
FROM CDB_ROLES
WHERE COMMON = 'YES'
ORDER BY ROLE;

예방 방법

1. 모든 CDB 관련 스크립트에 컨테이너 확인 로직 내장

운영 자동화 스크립트나 DDL 작업 전에 반드시 현재 컨테이너를 확인하고 자동으로 CDB$ROOT로 전환하는 로직을 포함시키는 것이 Best Practice입니다. 아래와 같은 표준 헤더 블록을 모든 CDB 관리 스크립트에 포함하면 실수로 인한 ORA-65066을 예방할 수 있습니다.

-- 표준 CDB 스크립트 헤더 (모든 공통 객체 관리 스크립트에 포함)
WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;

DECLARE
    v_container VARCHAR2(128);
BEGIN
    SELECT SYS_CONTEXT('USERENV', 'CON_NAME') 
    INTO v_container FROM DUAL;
    
    IF v_container != 'CDB$ROOT' THEN
        RAISE_APPLICATION_ERROR(-20001, 
            'ERROR: 이 스크립트는 CDB$ROOT에서 실행해야 합니다. '||
            '현재 컨테이너: ' || v_container);
    END IF;
    
    DBMS_OUTPUT.PUT_LINE('컨테이너 확인 완료: ' || v_container);
END;
/

2. PDB 상태 정기 모니터링 및 RESTRICTED 모드 PDB 즉시 조치

CONTAINER=ALL 옵션을 사용하는 작업은 모든 PDB가 정상적으로 열려 있어야 성공합니다. RESTRICTED 모드이거나 MOUNTED 상태인 PDB가 하나라도 있으면 ORA-65066이 발생할 수 있으므로, 정기적인 PDB 상태 점검을 운영 모니터링 항목에 포함시켜야 합니다. 또한 Oracle Enterprise Manager(OEM) 또는 커스텀 모니터링 스크립트를 활용하여 비정상 PDB 발생 시 즉시 알림을 받을 수 있도록 구성하는 것을 권장합니다.


관련 에러

  • ORA-65040: 플러그인 가능한 데이터베이스 내에서 허용되지 않는 작업을 시도할 때 발생. PDB에서 CDB 전용 명령어 실행 시 나타남.
  • ORA-65048: 공통 사용자, 롤 또는 프로파일이 이미 로컬로 존재할 때 공통 객체로 변환 시도 시 발생.
  • ORA-65050: 공통 사용자/롤/프로파일 생성 시 C## 접두어를 누락했을 때 발생하며, ORA-65066과 함께 자주 나타남.
  • ORA-65096: 공통 사용자 또는 롤 이름이 Oracle 내부 명명 규칙을 위반할 때 발생.
  • ORA-01031: 권한 부족 에러로, CDB$ROOT에서 SYSDBA 또는 SYSOPER 없이 공통 객체 변경 시 ORA-65066과 함께 발생하는 경우 있음.
DBMS 에러 코드 시리즈

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

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

댓글 남기기