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

ORA-65038
2026년 10월 13일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-65038 cannot connect to a closed pluggable database 는?

ORA-65038 에러는 Oracle Multitenant 환경에서 특정 PDB(Pluggable Database)가 닫혀 있는 상태임에도 불구하고 해당 PDB에 접속을 시도할 때 발생하는 에러입니다. Oracle 12c 이후 도입된 CDB(Container Database) 아키텍처에서 PDB는 독립적인 생명주기를 가지며, 관리자가 명시적으로 열지 않으면 접속이 불가능합니다. 주로 DBA가 PDB를 닫은 후 재기동을 잊거나, 데이터베이스 재시작 이후 자동으로 PDB가 열리지 않도록 설정된 경우에 빈번하게 발생합니다.


주요 발생 원인

1. PDB가 MOUNT 또는 CLOSE 상태로 존재하는 경우

가장 흔한 원인으로, PDB가 명시적으로 닫혀 있거나 마운트 상태에 머물러 있을 때 발생합니다. DBA가 유지보수 작업 후 PDB를 열지 않고 세션을 종료하거나, 특정 PDB에 대한 오류 복구 작업 중 CLOSE 명령을 실행한 이후 재기동을 빠뜨리는 경우가 대표적입니다. 이 상태에서는 CDB$ROOT에서는 조회가 가능하지만 해당 PDB에는 직접 접속할 수 없습니다.

2. 데이터베이스 재시작 후 PDB 자동 오픈 설정 미적용

CDB 전체를 재시작하면 CDB$ROOT는 자동으로 OPEN 상태가 되지만, PDB들은 기본적으로 MOUNT 상태로 남습니다. Oracle 19c 이하 환경에서는 PDB OPEN 트리거 또는 SAVE STATE 설정이 없으면 재기동 후 모든 PDB가 닫힌 채로 유지됩니다. 이는 운영 환경에서 서비스 장애로 이어질 수 있어 매우 중요한 원인입니다.

3. PDB가 RESTRICTED 모드이거나 내부 오류로 인해 비정상 CLOSE된 경우

PDB 내부에서 심각한 오류(데이터파일 손상, 아카이브 로그 문제 등)가 발생하면 Oracle이 해당 PDB를 자동으로 CLOSE 처리하는 경우가 있습니다. 또한 ALTER PLUGGABLE DATABASE ... CLOSE IMMEDIATE 명령 이후 재기동 없이 접속을 시도하는 경우에도 동일한 에러가 발생합니다. 이 경우 단순히 PDB를 열어도 해결되지 않을 수 있으므로 Alert 로그 확인이 필수입니다.


해결 방법

1단계: 현재 PDB 상태 확인

CDB에 SYSDBA로 접속한 후 전체 PDB의 상태를 먼저 확인합니다.

-- CDB$ROOT에 SYSDBA로 접속
CONNECT / AS SYSDBA

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

출력 결과에서 OPEN_MODE가 MOUNTED 또는 READ WRITE인지 확인합니다. MOUNTED이면 PDB가 닫혀 있는 상태입니다.


2단계: 특정 PDB 오픈

닫혀 있는 PDB를 열려면 아래 명령을 사용합니다.

-- 특정 PDB만 오픈
ALTER PLUGGABLE DATABASE pdb_name OPEN;

-- 읽기 전용으로 오픈이 필요한 경우
ALTER PLUGGABLE DATABASE pdb_name OPEN READ ONLY;

-- 모든 PDB를 한 번에 오픈
ALTER PLUGGABLE DATABASE ALL OPEN;

3단계: PDB 자동 오픈 설정 (SAVE STATE)

재기동 후에도 PDB가 자동으로 열리도록 상태를 저장합니다.

-- 특정 PDB OPEN 후 상태 저장
ALTER PLUGGABLE DATABASE pdb_name OPEN;
ALTER PLUGGABLE DATABASE pdb_name SAVE STATE;

-- 전체 PDB 상태 저장
ALTER PLUGGABLE DATABASE ALL OPEN;
ALTER PLUGGABLE DATABASE ALL SAVE STATE;

-- 저장된 PDB 상태 확인
SELECT CON_NAME, CON_ID, INSTANCE_NAME, STATE
FROM DBA_PDB_SAVED_STATES;

4단계: CDB 시작 트리거를 이용한 자동 오픈 (구버전 대응)

Oracle 12c 등 구버전에서는 SAVE STATE가 지원되지 않으므로 트리거를 활용합니다.

-- CDB 시작 시 모든 PDB를 자동 오픈하는 트리거 생성
CREATE OR REPLACE TRIGGER open_all_pdbs
  AFTER STARTUP ON DATABASE
BEGIN
  EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE ALL OPEN';
END open_all_pdbs;
/

-- 트리거 확인
SELECT TRIGGER_NAME, STATUS
FROM DBA_TRIGGERS
WHERE TRIGGER_NAME = 'OPEN_ALL_PDBS';

5단계: Alert 로그 및 PDB 상태 심층 확인

비정상 CLOSE인 경우 원인 파악이 선행되어야 합니다.

-- PDB 내부 오류 확인 (CDB 레벨에서)
SELECT CON_ID, DEST_ID, STATUS, ERROR
FROM V$ARCHIVE_DEST_STATUS
WHERE CON_ID > 2;

-- PDB 데이터파일 상태 확인
SELECT CON_ID, FILE#, NAME, STATUS, ENABLED
FROM V$DATAFILE
WHERE CON_ID = (SELECT CON_ID FROM V$PDBS WHERE NAME = 'PDB_NAME');

-- 특정 PDB로 컨테이너 전환 후 상태 상세 확인
ALTER SESSION SET CONTAINER = pdb_name;
SELECT * FROM V$RECOVER_FILE;

예방 방법

1. SAVE STATE를 이용한 PDB 자동 오픈 정책 수립

모든 운영 PDB에 대해 ALTER PLUGGABLE DATABASE ... SAVE STATE 명령을 적용하여 CDB 재시작 후에도 PDB가 자동으로 이전 상태로 복원되도록 설정하세요. 이 설정은 DBA_PDB_SAVED_STATES 뷰를 통해 주기적으로 검증하고, 신규 PDB 생성 시 표준 절차에 포함시키는 것이 Best Practice입니다.

-- 신규 PDB 생성 후 표준화 절차 예시
ALTER PLUGGABLE DATABASE new_pdb OPEN;
ALTER PLUGGABLE DATABASE new_pdb SAVE STATE;

-- 정기 점검 쿼리 (모든 PDB가 SAVE STATE 적용되었는지 확인)
SELECT P.NAME AS PDB_NAME,
       NVL(S.STATE, 'NOT SAVED') AS SAVED_STATE
FROM V$PDBS P
LEFT JOIN DBA_PDB_SAVED_STATES S ON P.NAME = S.CON_NAME
WHERE P.CON_ID > 2
ORDER BY P.NAME;

2. 모니터링 및 알람 체계 구축

주기적으로 PDB 상태를 모니터링하고, 비정상 CLOSE 발생 시 즉시 알람이 발생하도록 스크립트를 설정하세요. 아래 쿼리를 Cron Job 또는 Oracle Enterprise Manager 커스텀 지표로 등록하여 운영팀에 자동 알림이 가도록 구성하는 것을 권장합니다.

-- PDB 상태 이상 감지 쿼리 (MOUNTED 상태 PDB 존재 시 알람)
SELECT NAME, OPEN_MODE, CON_ID,
       CASE WHEN OPEN_MODE != 'READ WRITE' 
            THEN 'ALERT: PDB IS NOT OPEN' 
            ELSE 'OK' 
       END AS STATUS_CHECK
FROM V$PDBS
WHERE CON_ID > 2
  AND OPEN_MODE != 'READ WRITE';

관련 에러

  • ORA-65020: pluggable database already open – PDB가 이미 열려 있는 상태에서 OPEN을 재시도할 때 발생합니다.
  • ORA-65011: Pluggable database does not exist – 존재하지 않는 PDB에 접속을 시도할 때 발생하며, PDB 이름 오타나 삭제된 PDB 접속 시도 시 나타납니다.
  • ORA-01109: database not open – 전통적인 non-CDB 환경에서 데이터베이스 자체가 OPEN 상태가 아닐 때 발생하는 유사 에러입니다.
  • ORA-65040: operation not allowed from within a pluggable database – PDB 내에서 CDB 전용 명령을 실행할 때 발생하며, 컨테이너 전환 없이 작업하는 경우 자주 접하게 됩니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기