2026년 10월 11일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-65004 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-65004 missing file for pluggable database 는?
ORA-65004 에러는 Oracle Multitenant 환경에서 PDB(Pluggable Database)를 OPEN하거나 PLUG IN하는 과정에서 PDB에 필요한 데이터 파일, 템프 파일, 또는 언두 파일이 존재하지 않거나 접근 불가능할 때 발생하는 에러입니다. 주로 PDB를 다른 환경으로 이전(Relocate)하거나, 백업/복구 작업 이후, 또는 .xml 매니페스트 파일에 정의된 경로와 실제 파일 경로가 불일치할 때 트리거됩니다. 이 에러는 CDB(Container Database) 환경에서만 발생하는 특수한 에러로, 전통적인 Non-CDB 환경에서는 나타나지 않으며, Oracle 12c 이후 버전부터 Multitenant 아키텍처를 사용하는 DBA라면 반드시 숙지해야 합니다.
주요 발생 원인
1. PDB 데이터 파일 경로 불일치 또는 파일 누락
가장 흔한 원인으로, PDB를 PLUG IN할 때 사용하는 XML 매니페스트 파일에 기록된 데이터 파일 경로와 실제 OS상의 파일 경로가 다를 때 발생합니다. 예를 들어 소스 서버에서 /u01/oradata/ORCL/pdb1/에 있던 파일이 타겟 서버에서는 다른 경로에 복사되었거나, 복사 자체가 누락된 경우가 대표적입니다. 이 경우 Oracle은 XML 파일이 지정하는 경로에서 파일을 찾지 못해 ORA-65004를 반환합니다.
2. PDB UNPLUG 후 재 PLUG 과정에서 파일 정합성 문제
ALTER PLUGGABLE DATABASE … UNPLUG INTO 명령으로 PDB를 분리한 뒤, 해당 XML 파일을 사용해 다시 CREATE PLUGGABLE DATABASE … USING 명령으로 연결할 때 일부 파일이 삭제되었거나 접근 권한이 변경된 경우에 발생합니다. 특히 자동화된 배포 파이프라인이나 스크립트 기반 환경에서 파일 이동(mv) 후 원본 삭제가 누락되거나, OS 권한 문제로 Oracle 프로세스가 파일을 읽지 못하는 상황이 빈번히 발생합니다. 이 에러는 단순 경로 문제가 아닌 파일 자체의 존재 여부를 Oracle이 먼저 검증하는 과정에서 나타납니다.
3. RMAN 복구 또는 클론 작업 이후 파일 복원 미완료
RMAN을 이용해 PDB를 복구하거나 CREATE PLUGGABLE DATABASE … FROM 구문으로 PDB를 클론할 때, 일부 데이터 파일이 복원되지 않은 상태에서 PDB OPEN을 시도하면 ORA-65004가 발생합니다. 백업 셋이 불완전하거나 특정 파일이 백업에 포함되지 않았을 가능성도 있으며, 특히 TEMP 파일이나 UNDO 전용 파일이 빠지는 경우가 실무에서 자주 목격됩니다. RMAN RESTORE 후 반드시 모든 파일의 복원 여부를 확인하는 검증 단계가 필요합니다.
해결 방법
원인 1 해결: 누락된 파일 경로 확인 및 수정
먼저 PDB에 등록된 파일 목록과 실제 OS 파일을 비교합니다.
-- CDB$ROOT에 접속한 상태에서 실행
-- 문제가 되는 PDB의 파일 목록 조회
SELECT file#, name, status, con_id
FROM v$datafile
WHERE con_id = (SELECT con_id FROM v$pdbs WHERE name = 'PDB1');
-- TEMP 파일도 함께 확인
SELECT file#, name, status, con_id
FROM v$tempfile
WHERE con_id = (SELECT con_id FROM v$pdbs WHERE name = 'PDB1');
-- XML 매니페스트 파일의 경로 정보를 확인하여
-- 실제 경로로 파일을 복사하거나 심볼릭 링크를 생성한 뒤
-- FILE_NAME_CONVERT 옵션으로 경로를 재매핑하여 PLUG IN 재시도
CREATE PLUGGABLE DATABASE pdb1
USING '/backup/pdb1.xml'
COPY
FILE_NAME_CONVERT = ('/old/path/pdb1/', '/u01/oradata/CDB1/pdb1/');
-- PDB가 이미 생성된 상태에서 특정 파일 경로를 변경해야 한다면
-- 해당 파일을 오프라인 상태로 전환 후 이동 및 경로 재지정
ALTER DATABASE MOVE DATAFILE
'/old/path/pdb1/system01.dbf'
TO '/u01/oradata/CDB1/pdb1/system01.dbf';
원인 2 해결: UNPLUG/PLUG 과정에서의 파일 검증
-- UNPLUG 전 PDB에 속한 모든 파일 목록을 사전에 추출하여 백업
SELECT p.name AS pdb_name,
d.name AS file_path,
d.bytes / 1024 / 1024 AS size_mb
FROM v$datafile d
JOIN v$pdbs p ON d.con_id = p.con_id
WHERE p.name = 'PDB1'
UNION ALL
SELECT p.name,
t.name,
t.bytes / 1024 / 1024
FROM v$tempfile t
JOIN v$pdbs p ON t.con_id = p.con_id
WHERE p.name = 'PDB1';
-- UNPLUG 수행
ALTER PLUGGABLE DATABASE pdb1 CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE pdb1 UNPLUG INTO '/backup/pdb1_manifest.xml';
-- OS 레벨에서 해당 파일들을 타겟 경로로 복사 후
-- PLUG IN 시 CHECK_VIOLATIONS 옵션으로 사전 검증 수행
CREATE PLUGGABLE DATABASE pdb1_new
USING '/backup/pdb1_manifest.xml'
NOCOPY
TEMPFILE REUSE;
-- 위반 항목 확인
SELECT message, status
FROM pdb_plug_in_violations
WHERE name = 'PDB1_NEW'
ORDER BY time DESC;
원인 3 해결: RMAN 복구 후 파일 상태 점검
-- RMAN에서 복구 후 누락 파일 확인
-- SQL*Plus 또는 RMAN 프롬프트에서 실행
SELECT name, status
FROM v$datafile
WHERE status IN ('OFFLINE', 'RECOVER', 'SYSOFF')
AND con_id = (SELECT con_id FROM v$pdbs WHERE name = 'PDB1');
-- RMAN으로 특정 데이터 파일만 선택적으로 복원
-- RMAN 프롬프트에서:
-- RMAN> RUN {
-- SET NEWNAME FOR DATAFILE '/old/path/pdb1/users01.dbf'
-- TO '/u01/oradata/CDB1/pdb1/users01.dbf';
-- RESTORE DATAFILE '/old/path/pdb1/users01.dbf';
-- SWITCH DATAFILE ALL;
-- RECOVER DATAFILE '/u01/oradata/CDB1/pdb1/users01.dbf';
-- }
-- SQL로 누락된 TEMP 파일 재생성
ALTER SESSION SET CONTAINER = pdb1;
ALTER TABLESPACE TEMP ADD TEMPFILE
'/u01/oradata/CDB1/pdb1/temp01.dbf'
SIZE 100M AUTOEXTEND ON;
-- 모든 조치 후 PDB OPEN 시도
ALTER PLUGGABLE DATABASE pdb1 OPEN READ WRITE;
-- 에러 지속 시 RESETLOGS 옵션 사용 (복구 시나리오)
ALTER PLUGGABLE DATABASE pdb1 OPEN RESETLOGS;
예방 방법
1. PDB 이동/복제 전 파일 목록 사전 검증 자동화
PDB UNPLUG 또는 이전 작업 전에 반드시 파일 무결성 점검 스크립트를 운영 절차에 포함시켜야 합니다. 아래와 같은 쿼리를 Shell 스크립트와 연동하여 파일 존재 여부를 OS 레벨에서 자동 검증하고, 이상이 없을 때만 다음 단계로 진행하도록 자동화 파이프라인을 구성하는 것이 Best Practice입니다.
-- 정기적으로 실행하여 파일 상태 모니터링
SELECT con_id, name, status, bytes/1024/1024 AS mb
FROM v$datafile
WHERE status != 'ONLINE'
AND con_id > 2 -- PDB 파일만 필터링
ORDER BY con_id, name;
2. PDB 백업 시 XML 매니페스트와 데이터 파일 함께 관리
RMAN 백업 정책에 PDB의 모든 데이터 파일이 포함되었는지 주기적으로 VALIDATE 명령으로 검증하고, UNPLUG로 생성된 XML 파일은 반드시 데이터 파일과 동일한 스토리지 또는 중앙 백업 저장소에 함께 보관해야 합니다. XML 파일만 있고 실제 데이터 파일이 없거나 그 반대의 경우 모두 ORA-65004를 유발하므로, 이 두 가지는 항상 한 세트로 관리하는 절차를 수립하십시오.
관련 에러
- ORA-65005:
missing or invalid file for pluggable database– ORA-65004와 유사하나, 파일이 존재하지만 형식이 올바르지 않거나 손상된 경우에 발생합니다. - ORA-01157:
cannot identify/lock data file– 데이터 파일을 식별하거나 잠금을 획득하지 못할 때 발생하며, ORA-65004와 함께 나타나는 경우가 많습니다. - ORA-27037:
unable to obtain file status– OS 레벨에서 파일 상태를 읽지 못할 때 발생하며, 권한 문제 또는 파일 시스템 마운트 실패와 연관됩니다. - ORA-65011:
pluggable database does not exist– PDB 자체가 등록되지 않은 경우로, PLUG IN 실패의 후속 에러로 이어질 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.