2026년 10월 16일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-65090 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-65090 operation not allowed in a non-CDB database 는?
ORA-65090 에러는 Oracle Multitenant 아키텍처(CDB/PDB 구조)에서만 사용 가능한 명령이나 작업을 비-CDB(non-CDB) 데이터베이스에서 실행하려고 할 때 발생합니다. 즉, 해당 데이터베이스가 Container Database(CDB)가 아닌 일반 단일 인스턴스 데이터베이스임에도 불구하고, CDB 전용 문법이나 기능을 사용하려 할 때 이 에러가 트리거됩니다. Oracle 12c 이후 도입된 Multitenant 기능을 전제로 하는 DDL, DML, 또는 관리 명령을 non-CDB 환경에서 실행하면 반드시 이 에러를 마주치게 됩니다.
주요 발생 원인
- CDB 전용 명령어를 non-CDB에서 실행
가장 흔한 원인으로, CREATE PLUGGABLE DATABASE, ALTER PLUGGABLE DATABASE, DROP PLUGGABLE DATABASE 등 CDB 환경에서만 유효한 SQL 명령어를 일반 데이터베이스에서 실행할 때 발생합니다. Oracle 12c부터 Multitenant 옵션이 추가되면서 이런 문법이 생겼지만, 이를 사용하려면 반드시 CDB로 구성된 데이터베이스여야 합니다. 개발자나 DBA가 CDB 환경에서 작업하다가 non-CDB 환경으로 전환된 사실을 인지하지 못하고 동일한 스크립트를 실행할 때 자주 발생합니다.
- 공통 사용자(Common User) 생성 시도
Oracle CDB에서는 C##으로 시작하는 공통 사용자(Common User)를 생성하여 모든 PDB에서 공통으로 사용할 수 있습니다. 그런데 이 CDB 전용 사용자 생성 문법(CREATE USER C##username ...)을 non-CDB 환경에서 사용하면 ORA-65090이 발생합니다. 이는 공통 사용자 개념 자체가 Multitenant 아키텍처에 종속되어 있기 때문이며, non-CDB에서는 이러한 개념 자체가 존재하지 않습니다.
- CDB 관련 뷰 또는 파라미터 참조
CDB_* 계열의 딕셔너리 뷰(예: CDB_USERS, CDB_TABLES)나 CON_ID, CON_NAME 같은 CDB 전용 컬럼 또는 파라미터를 non-CDB에서 조회하거나 설정하려 할 때도 이 에러가 발생할 수 있습니다. 또한 ALTER SYSTEM SET ENABLE_PLUGGABLE_DATABASE=TRUE처럼 CDB 전환과 관련된 파라미터 조작을 non-CDB에서 시도하면 에러가 납니다. 운영 자동화 스크립트가 환경에 따라 분기 없이 동일 로직을 실행할 때 이런 문제가 특히 자주 발생합니다.
해결 방법
1단계: 현재 데이터베이스가 CDB인지 확인
가장 먼저 현재 접속된 데이터베이스가 CDB인지 non-CDB인지 확인해야 합니다.
-- CDB 여부 확인
SELECT NAME, CDB, CON_ID
FROM V$DATABASE;
-- 결과 예시
-- NAME CDB CON_ID
-- -------- --- ------
-- ORCL NO 0 <- non-CDB
-- ORCL YES 0 <- CDB (Root Container)
-- 현재 컨테이너 확인 (CDB 환경에서만 유효)
SHOW CON_NAME;
2단계: CDB 전용 명령어 사용 시 해결책
non-CDB에서 PDB 생성 시도 → 에러 발생 예시:
-- 잘못된 예 (non-CDB에서 실행 시 ORA-65090 발생)
CREATE PLUGGABLE DATABASE my_pdb
ADMIN USER pdb_admin IDENTIFIED BY "Oracle123"
FILE_NAME_CONVERT = ('/u01/oradata/seed/', '/u01/oradata/my_pdb/');
-- ORA-65090: operation not allowed in a non-CDB database
해결책: CDB로 전환하거나 데이터베이스를 재구성
만약 Multitenant 기능이 필요하다면, non-CDB를 CDB로 전환해야 합니다. Oracle 12c 이상에서는 아래 절차로 전환 가능합니다.
-- 1. non-CDB를 CDB로 마이그레이션하기 위해 먼저 non-CDB를 읽기 전용으로 오픈
SHUTDOWN IMMEDIATE;
STARTUP OPEN READ ONLY;
-- 2. non-CDB → PDB 변환 스크립트 생성
EXEC DBMS_PDB.DESCRIBE(PDB_DESCR_FILE => '/tmp/my_noncdb.xml');
-- 3. 이후 새 CDB를 생성하고 해당 XML을 사용해 PDB로 플러그인
-- (새 CDB 환경에서 실행)
CREATE PLUGGABLE DATABASE my_pdb
USING '/tmp/my_noncdb.xml'
COPY
FILE_NAME_CONVERT = ('/old/path/', '/new/path/');
3단계: 공통 사용자 생성 오류 해결
-- 잘못된 예 (non-CDB에서 CDB 공통 사용자 생성 시도)
CREATE USER C##APPUSER IDENTIFIED BY "Welcome1";
-- ORA-65090: operation not allowed in a non-CDB database
-- 올바른 예 (non-CDB에서는 일반 사용자 생성)
CREATE USER APPUSER IDENTIFIED BY "Welcome1"
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
QUOTA UNLIMITED ON USERS;
-- 필요한 권한 부여
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO APPUSER;
4단계: 스크립트에 CDB/non-CDB 분기 로직 추가
-- CDB 여부에 따라 분기 처리하는 PL/SQL 예제
DECLARE
v_cdb VARCHAR2(3);
BEGIN
SELECT CDB INTO v_cdb FROM V$DATABASE;
IF v_cdb = 'YES' THEN
-- CDB 전용 작업 수행
DBMS_OUTPUT.PUT_LINE('CDB 환경: PDB 관련 작업 진행 가능');
EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE ALL OPEN';
ELSE
-- non-CDB 전용 작업 수행
DBMS_OUTPUT.PUT_LINE('non-CDB 환경: 일반 DB 작업만 가능');
-- 일반 사용자 생성 등 non-CDB 작업
END IF;
END;
/
5단계: CDB 관련 뷰 사용 시 주의
-- non-CDB에서 CDB_* 뷰 대신 DBA_* 뷰 사용
-- 잘못된 예
SELECT * FROM CDB_USERS WHERE CON_ID = 1;
-- ORA-65090 또는 ORA-00942 발생 가능
-- 올바른 예 (non-CDB에서는 DBA_USERS 사용)
SELECT USERNAME, ACCOUNT_STATUS, DEFAULT_TABLESPACE, CREATED
FROM DBA_USERS
ORDER BY CREATED DESC;
예방 방법
- 배포 스크립트에 환경 검증 로직을 반드시 포함하세요
모든 데이터베이스 배포 스크립트의 최상단에 현재 데이터베이스가 CDB인지 non-CDB인지 자동으로 감지하고, 환경에 맞는 로직만 실행되도록 분기 처리를 추가하는 것이 Best Practice입니다. 아래는 SQL*Plus 환경에서 활용 가능한 예방 스크립트입니다.
“`sql
— 스크립트 최상단에 환경 확인 로직 추가
SET SERVEROUTPUT ON
DECLARE
v_cdb V$DATABASE.CDB%TYPE;
BEGIN
SELECT CDB INTO v_cdb FROM V$DATABASE;
IF v_cdb != ‘YES’ THEN
RAISE_APPLICATION_ERROR(-20001,
‘ERROR: 이 스크립트는 CDB 환경에서만 실행 가능합니다. 현재 non-CDB 환경입니다.’);
END IF;
DBMS_OUTPUT.PUT_LINE(‘환경 검증 완료: CDB 환경 확인됨’);
END;
/
“`
- 표준 접속 프로파일에 환경 정보를 명시하고, CI/CD 파이프라인에서 환경 태그를 관리하세요
DBA 팀과 개발팀이 사용하는 접속 정보(tnsnames.ora, connection string)에 해당 데이터베이스가 CDB인지 non-CDB인지를 명확히 주석이나 라벨로 표시해야 합니다. 또한 Jenkins, GitLab CI 등의 CI/CD 파이프라인에서 데이터베이스 환경 유형을 환경 변수(예: DB_TYPE=CDB 또는 DB_TYPE=NON_CDB)로 관리하여, 잘못된 환경에 스크립트가 실행되는 것을 원천 차단해야 합니다.
관련 에러
- ORA-65091:
operation not allowed in a pluggable database— PDB에서 CDB Root 전용 작업을 시도할 때 발생합니다. - ORA-65048:
error encountered when switching to pluggable database— PDB 전환 중 발생하는 에러입니다. - ORA-17628:
Oracle error 65090 returned by remote Oracle server— 원격 데이터베이스 링크를 통해 non-CDB에서 CDB 전용 작업을 시도할 때 나타날 수 있습니다. - ORA-00942:
table or view does not exist— non-CDB에서CDB_*뷰를 직접 조회하려 할 때 함께 발생할 수 있는 에러입니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.