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

ORA-65000
2026년 10월 11일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-65000 missing or invalid pluggable database name 는?

ORA-65000 에러는 Oracle Multitenant 환경(12c 이상)에서 PDB(Pluggable Database)의 이름이 누락되었거나 유효하지 않을 때 발생하는 에러입니다. 주로 CDB(Container Database) 환경에서 PDB를 생성, 변경, 삭제하거나 관련 명령을 실행할 때 PDB 이름을 잘못 지정하거나 아예 입력하지 않은 경우에 트리거됩니다. 이 에러는 Oracle 12c 이후 멀티테넌트 아키텍처가 도입되면서 새롭게 등장한 에러 코드로, 전통적인 단일 인스턴스 데이터베이스 환경에서는 발생하지 않습니다.


주요 발생 원인

1. PDB 이름 없이 또는 잘못된 구문으로 CREATE PLUGGABLE DATABASE 실행

PDB를 생성할 때 이름을 지정하지 않거나, 예약어 혹은 특수문자를 PDB 이름으로 사용하면 이 에러가 발생합니다. Oracle은 PDB 이름에 대해 엄격한 명명 규칙(영문자로 시작, 특수문자 불가 등)을 적용하므로, 이를 위반하면 ORA-65000이 즉시 발생합니다. 특히 PDB 이름을 큰따옴표 없이 숫자로 시작하거나, 공백을 포함하는 경우가 실수로 자주 발생합니다.

2. ALTER PLUGGABLE DATABASE 명령 시 존재하지 않는 PDB 이름 참조

현재 CDB에 존재하지 않는 PDB 이름을 ALTER 명령에 사용하면 이 에러가 발생합니다. DBA가 PDB 이름을 오타로 잘못 입력하거나, 이미 DROP된 PDB를 참조하는 스크립트를 그대로 재사용하는 경우가 대표적입니다. 이 상황은 자동화 배치 스크립트나 운영 도구에서 특히 빈번하게 발생하며, 운영 중 장애로 이어질 수 있어 주의가 필요합니다.

3. CDB가 아닌 일반 데이터베이스에서 PDB 관련 명령 실행

멀티테넌트 기능을 사용하지 않는 일반(Non-CDB) 데이터베이스에서 PDB 관련 DDL이나 명령을 실행하면 ORA-65000이 발생할 수 있습니다. 일부 DBA들이 Non-CDB 환경을 CDB로 착각하거나, 잘못된 데이터베이스에 접속한 상태에서 스크립트를 실행하는 경우가 이에 해당합니다. 현재 접속 환경이 CDB인지 Non-CDB인지 항상 확인하는 습관이 중요합니다.


해결 방법

원인 1 해결: PDB 이름 올바르게 지정하여 재생성

먼저 현재 CDB 내에 존재하는 PDB 목록을 확인하고, 올바른 명명 규칙에 따라 PDB를 생성합니다.

-- 현재 CDB의 PDB 목록 조회
SELECT PDB_ID, PDB_NAME, STATUS, CON_ID
FROM   DBA_PDBS
ORDER  BY PDB_ID;

-- 잘못된 PDB 생성 예시 (에러 발생)
-- CREATE PLUGGABLE DATABASE 123pdb ADMIN USER pdbadmin IDENTIFIED BY password;

-- 올바른 PDB 생성 예시
CREATE PLUGGABLE DATABASE pdb_production
  ADMIN USER pdbadmin IDENTIFIED BY "SecurePass#2024"
  ROLES = (DBA)
  DEFAULT TABLESPACE users
    DATAFILE '/u01/oradata/CDB1/pdb_production/users01.dbf'
    SIZE 250M AUTOEXTEND ON
  FILE_NAME_CONVERT = (
    '/u01/oradata/CDB1/pdbseed/',
    '/u01/oradata/CDB1/pdb_production/'
  );

-- 생성 후 PDB 오픈
ALTER PLUGGABLE DATABASE pdb_production OPEN;

-- 상태 확인
SELECT NAME, OPEN_MODE, RESTRICTED
FROM   V$PDBS
WHERE  NAME = 'PDB_PRODUCTION';

원인 2 해결: PDB 이름 정확성 확인 후 ALTER 실행

ALTER 명령을 실행하기 전에 반드시 대상 PDB가 실제로 존재하는지 사전 검증합니다.

-- PDB 존재 여부 사전 확인 (스크립트 내 검증 로직)
DECLARE
  v_count NUMBER;
  v_pdb_name VARCHAR2(128) := 'PDB_TARGET'; -- 변경할 PDB 이름
BEGIN
  SELECT COUNT(*)
  INTO   v_count
  FROM   DBA_PDBS
  WHERE  PDB_NAME = v_pdb_name;

  IF v_count = 0 THEN
    RAISE_APPLICATION_ERROR(-20001,
      'PDB ' || v_pdb_name || ' does not exist. Please verify the PDB name.');
  ELSE
    DBMS_OUTPUT.PUT_LINE('PDB found: ' || v_pdb_name || '. Proceeding with ALTER.');
  END IF;
END;
/

-- PDB 이름 확인 후 올바른 ALTER 실행 예시
-- PDB를 CLOSE 후 다시 OPEN (RESTRICTED 모드 해제)
ALTER PLUGGABLE DATABASE pdb_production CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE pdb_production OPEN READ WRITE;

-- PDB를 특정 트리거를 사용해 자동 오픈 설정
ALTER PLUGGABLE DATABASE pdb_production SAVE STATE;

-- 여러 PDB 동시 오픈 (ALL 키워드 활용)
ALTER PLUGGABLE DATABASE ALL OPEN;

-- 특정 PDB만 제외하고 오픈
ALTER PLUGGABLE DATABASE ALL EXCEPT pdb_test OPEN;

원인 3 해결: CDB 여부 확인 후 명령 실행

현재 데이터베이스가 CDB인지 확인하는 쿼리를 항상 먼저 실행합니다.

-- 현재 데이터베이스가 CDB인지 확인
SELECT NAME, CDB, CON_ID, CON_NAME
FROM   V$DATABASE;

-- CON_ID와 현재 컨테이너 확인
SELECT SYS_CONTEXT('USERENV', 'CON_NAME')  AS CURRENT_CONTAINER,
       SYS_CONTEXT('USERENV', 'CON_ID')    AS CONTAINER_ID,
       SYS_CONTEXT('USERENV', 'CDB_NAME')  AS CDB_NAME
FROM   DUAL;

-- CDB ROOT(CDB$ROOT)에서만 PDB 관련 명령 실행 가능 확인
-- 현재 컨테이너가 CDB$ROOT가 아니면 아래 명령으로 전환
ALTER SESSION SET CONTAINER = CDB$ROOT;

-- 전환 후 PDB 목록 재확인
SHOW PDBS;

-- PDB 내부(특정 PDB 세션)에서 CDB 레벨 작업이 필요한 경우
-- CONNECT SYS/password@CDB_SERVICE AS SYSDBA 로 재접속 필요

예방 방법

1. PDB 이름 명명 규칙 표준화 및 생성 전 검증 스크립트 도입

모든 PDB 이름은 조직 내 명명 표준(예: PDB_[환경]_[서비스명] 형식)을 정의하고, 생성 전 자동화 검증 스크립트를 반드시 실행하도록 프로세스화합니다. 예를 들어 Jenkins나 Ansible 같은 자동화 도구를 통해 PDB 생성 작업을 수행할 때, 사전에 PDB 이름 유효성 검사(특수문자, 예약어, 중복 여부)를 포함시키면 휴먼 에러를 크게 줄일 수 있습니다.

-- PDB 이름 유효성 사전 검사 예시 프로시저
CREATE OR REPLACE PROCEDURE validate_pdb_name(p_pdb_name IN VARCHAR2) AS
  v_count NUMBER;
BEGIN
  -- 중복 PDB 이름 확인
  SELECT COUNT(*) INTO v_count
  FROM   DBA_PDBS
  WHERE  PDB_NAME = UPPER(p_pdb_name);

  IF v_count > 0 THEN
    RAISE_APPLICATION_ERROR(-20002, 'PDB name already exists: ' || p_pdb_name);
  END IF;

  -- 이름 길이 확인 (Oracle PDB 이름 최대 128자)
  IF LENGTH(p_pdb_name) > 128 OR LENGTH(p_pdb_name) = 0 THEN
    RAISE_APPLICATION_ERROR(-20003, 'Invalid PDB name length.');
  END IF;

  DBMS_OUTPUT.PUT_LINE('PDB name validation passed: ' || p_pdb_name);
END validate_pdb_name;
/

2. CDB/PDB 접속 환경 자동 확인 로그인 트리거 설정

DBA 세션 시작 시 현재 접속 환경(CDB 여부, 컨테이너 이름)을 자동으로 출력하는 로그인 트리거를 설정하면, 잘못된 환경에서 명령을 실행하는 실수를 방지할 수 있습니다. 또한 운영 스크립트 상단에 항상 환경 확인 쿼리를 포함시켜 CDB가 아닌 환경에서 PDB 관련 명령이 실행되지 않도록 가드 코드를 추가합니다.

-- DBA 로그인 시 자동 환경 확인 트리거
CREATE OR REPLACE TRIGGER check_cdb_environment
  AFTER LOGON ON DATABASE
DECLARE
  v_con_name  VARCHAR2(100);
  v_cdb       VARCHAR2(3);
BEGIN
  SELECT SYS_CONTEXT('USERENV', 'CON_NAME'),
         (SELECT CDB FROM V$DATABASE)
  INTO   v_con_name, v_cdb
  FROM   DUAL;

  IF v_cdb = 'YES' THEN
    DBMS_OUTPUT.PUT_LINE('[INFO] Connected to CDB. Current Container: ' || v_con_name);
  ELSE
    DBMS_OUTPUT.PUT_LINE('[WARN] This is a Non-CDB environment. PDB commands are not available.');
  END IF;
EXCEPTION
  WHEN OTHERS THEN NULL;
END;
/

관련 에러

  • ORA-65011: Pluggable database string does not exist — 존재하지 않는 PDB를 참조할 때 발생하며, ORA-65000과 함께 자주 나타납니다.
  • ORA-65020: pluggable database string already open in a different mode — PDB가 이미 다른 모드(READ ONLY, RESTRICTED 등)로 열려 있을 때 ALTER 시도 시 발생합니다.
  • ORA-65040: operation not allowed from within a pluggable database — PDB 세션 내에서 CDB 레벨 명령을 실행할 때 발생하며, ORA-65000과 함께 멀티테넌트 운영 시 주의해야 할 대표적인 에러입니다.
  • ORA-01031: insufficient privileges — CDB 레벨의 PDB 관리를 위해 SYSDBA 또는 SYSOPER 권한이 없는 계정으로 접속했을 때 함께 발생하는 경우가 많습니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기