Oracle Database 19c에서 특정 데이터파일 하나가 손상되었거나 사라졌다면, 데이터베이스 전체를 곧바로 복구 대상으로 잡지 않는 편이 안전합니다. 데이터베이스가 열려 있고 손상 범위가 일부 파일에 한정됐다면 해당 파일 또는 그 파일이 속한 테이블스페이스를 오프라인으로 전환한 뒤 RESTORE DATAFILE, RECOVER DATAFILE, 온라인 전환 순서로 처리합니다.
이 순서는 완전 복구를 전제로 합니다. 과거 시점으로 되돌리는 불완전 복구, SYSTEM·SYSAUX·UNDO·활성 롤백 세그먼트가 얽힌 장애, 컨트롤 파일 자체의 문제, 아카이브 로그 누락은 같은 명령을 기계적으로 적용할 상황이 아닙니다. 아래 예제는 테스트 환경에서 절차를 이해하기 위한 것이며, 운영 환경에서는 장애 등급과 백업·아카이브 로그 확보 여부를 먼저 판단해야 합니다.
복구 대상이 일부 데이터파일이고 완전 복구가 가능할 때는 먼저 파일 번호와 오류를 확인하고, 파일을 오프라인으로 둔 다음 RMAN에서 RESTORE로 백업본을 되살리고 RECOVER로 redo를 적용합니다. RECOVER가 끝났다는 출력과 데이터파일 상태를 확인하기 전에는 온라인 전환을 하지 않습니다. 블록 몇 개의 손상이라면 파일 전체 복구가 아니라 블록 미디어 복구가 더 적합할 수 있습니다.
적용 조건과 영향 범위
| 항목 | 적용·확인 내용 | 운영 영향 또는 예외 |
|---|---|---|
| 대상 | 일부 데이터파일의 손상·분실과 완전 복구 | 전체 데이터베이스 또는 컨트롤 파일 장애에는 별도 절차가 필요합니다. |
| 선행 자료 | 사용 가능한 RMAN 백업과 필요한 archived redo | 필요 로그가 없으면 목표 시점과 복구 방식부터 다시 결정합니다. |
| 접속 권한 | RMAN TARGET 연결과 SYSBACKUP 또는 SYSDBA 권한 | 권한 오류를 우회하려고 임의 계정으로 명령을 반복하지 않습니다. |
| 가용성 | 영향 테이블스페이스를 오프라인으로 둘 수 있는지 | 그 안의 객체를 쓰는 업무는 중단되거나 오류를 낼 수 있습니다. |
RESTORE와 RECOVER가 맡는 일
RESTORE DATAFILE은 백업 또는 이미지 복사본에서 물리 파일을 되가져오는 단계입니다. 여기서 파일은 백업 시점의 상태이므로, 그 뒤에 발생한 커밋까지 반영되어 있지 않습니다. RECOVER DATAFILE은 필요한 archived redo와 사용할 수 있는 증분 백업을 적용해 파일 헤더와 데이터 블록을 현재 일관성 지점까지 전진시키는 단계입니다.
따라서 파일이 없다는 이유만으로 RECOVER부터 실행하면 안 됩니다. 반대로 백업본을 복원했다고 해서 온라인으로 전환해도 안 됩니다. 복원은 과거 물리본을 준비하는 일이고, 복구는 그 물리본에 이후 변경을 적용하는 일입니다. 이 둘이 끝나야 데이터베이스가 해당 파일을 일관된 구성원으로 받아들일 수 있습니다.
작업 전: 파일 번호·오류·의존 업무를 좁힌다
경보에 파일 경로가 보이더라도, 운영 명령은 파일 번호를 기준으로 확인하는 편이 명확합니다. 데이터베이스가 열려 있는 경우 V$RECOVER_FILE은 복구가 필요한 파일과 오류를 보여 주고, V$DATAFILE, V$TABLESPACE 조인은 실제 파일과 테이블스페이스 이름을 연결합니다. 복원된 또는 새로 만든 컨트롤 파일에서는 V$RECOVER_FILE 정보가 정확하지 않을 수 있다는 제한도 기억해야 합니다.
SELECT rf.file#,
df.name AS datafile_name,
ts.name AS tablespace_name,
rf.error,
rf.online_status,
rf.change#
FROM v$recover_file rf
JOIN v$datafile df ON df.file# = rf.file#
JOIN v$tablespace ts ON ts.ts# = df.ts#
ORDER BY rf.file#;
목적: 복구 대상 파일과 오류를 식별합니다. 권한: 동적 성능 뷰 조회 권한 또는 적절한 관리 권한이 필요합니다. 예상 결과: 파일 번호, 경로, 테이블스페이스, 오류 원인을 한 행씩 확인합니다. 결과가 없다고 해서 저장장치 오류가 없었다고 단정하지 말고 alert log와 운영 알림도 함께 확인합니다.
백업과 필요한 redo를 먼저 확인
복구 창을 열기 전에 RMAN 저장소에서 해당 파일 백업과 archived redo 확보 가능성을 확인합니다. 이 명령은 데이터를 바꾸지 않지만, 목록에 보인다는 사실만으로 복구 완료를 보장하지는 않습니다. 백업 피스 접근성, 암호화 키스토어, 테이프 미디어, 로그 보존 정책도 실제 복구 시간에 영향을 줍니다.
LIST BACKUP OF DATAFILE 7;
LIST ARCHIVELOG ALL;
RESTORE DATAFILE 7 PREVIEW;
목적: RMAN이 사용할 수 있는 후보와 복구에 필요한 파일을 미리 확인합니다. 적용 버전: Oracle Database 19c RMAN. 예상 결과: 백업·아카이브 로그 목록과 PREVIEW 결과가 출력됩니다. PREVIEW는 파일을 쓰지 않는 계획 확인이며, 실제 복구 성공 보증은 아닙니다.
최소 재현 예제로 보는 안전한 순서
예제에서는 파일 번호 7이 업무 테이블스페이스 APPDATA에 속한다고 가정합니다. 실제 환경에서는 숫자와 이름을 위 진단 결과로 바꿉니다. SYSTEM, SYSAUX, UNDO의 파일처럼 데이터베이스 기동과 직결되는 구성 요소는 이 단순 예제를 적용하지 말고 장애 런북과 Oracle 복구 문서를 우선합니다.
오프라인 전환은 해당 테이블스페이스를 쓰는 세션에 오류와 업무 중단을 일으킬 수 있습니다. 영향받는 서비스, 배치, 연결 풀을 먼저 멈추거나 우회하고, 파일 번호가 맞는지 두 사람이 교차 확인한 뒤 진행합니다. 삭제·초기화·파일 시스템 복사로 문제를 덮지 말고 원본 증적과 alert log를 보존합니다.
-- RMAN에 TARGET으로 연결한 뒤 실행
ALTER DATABASE DATAFILE 7 OFFLINE;
RESTORE DATAFILE 7;
RECOVER DATAFILE 7;
ALTER DATABASE DATAFILE 7 ONLINE;
목적: 파일 7을 업무에서 분리한 뒤 백업본 복원과 redo 적용을 수행하고, 성공 확인 후 다시 사용 가능하게 합니다. 권한: SYSBACKUP 또는 SYSDBA로 RMAN TARGET 연결이 필요합니다. 예상 결과: RESTORE는 복원된 파일을, RECOVER는 적용한 redo와 완료 상태를 출력합니다. 출력에 오류가 남으면 ONLINE을 실행하지 않습니다.
원래 위치에 복원할 수 없을 때
스토리지 장애로 원래 경로를 사용할 수 없으면 새 경로에 복원한 뒤 컨트롤 파일이 새 파일을 가리키도록 전환해야 합니다. 단순히 운영체제에서 파일을 옮기는 방식은 RMAN 저장소와 컨트롤 파일의 인식을 어긋나게 만들 수 있습니다. SET NEWNAME과 SWITCH DATAFILE ALL은 바로 그 연결을 명시적으로 갱신하는 수단입니다.
RUN {
SET NEWNAME FOR DATAFILE 7 TO '/u02/oradata/ORCL/appdata07.dbf';
RESTORE DATAFILE 7;
SWITCH DATAFILE ALL;
RECOVER DATAFILE 7;
}
ALTER DATABASE DATAFILE 7 ONLINE;
새 경로 전환 전에는 기존 제어 파일 백업과 정확한 파일 매핑을 확보합니다. SWITCH 뒤에 문제가 보이면 즉시 파일을 온라인으로 올리려 하지 말고 RMAN 출력, 제어 파일의 현재 파일명, 스토리지 접근 권한을 다시 확인합니다. 복구 작업의 되돌림은 일반 DML의 ROLLBACK처럼 한 명령으로 끝나지 않으므로, 검증되지 않은 경로 전환을 운영에서 즉흥적으로 수행하지 않습니다.
온라인 전환 전후에 확인할 것
| 시점 | 확인 방법 | 통과 판단 |
|---|---|---|
| RECOVER 전 | 파일 번호, 백업, redo, 저장 경로와 서비스 영향 | 대상과 복구 재료가 문서화되어 있습니다. |
| RECOVER 후 | RMAN 출력, alert log, 복구 필요 파일 조회 | 복구 오류가 없고 추가 조치 요구가 없습니다. |
| ONLINE 후 | 파일 상태와 제한된 업무 점검 | 파일이 ONLINE이며 대표 읽기·쓰기 경로가 정상입니다. |
SELECT df.file#,
df.name,
df.status,
ts.name AS tablespace_name,
ts.status AS tablespace_status
FROM v$datafile df
JOIN v$tablespace ts ON ts.ts# = df.ts#
WHERE df.file# = 7;
목적: 온라인 전환 뒤 파일과 테이블스페이스 상태를 확인합니다. 예상 결과: 대상 파일의 상태가 ONLINE으로 나타납니다. 이 조회는 논리 데이터 정합성이나 애플리케이션의 모든 업무 흐름까지 검증하지 않으므로, 사전에 정한 최소 업무 점검을 별도로 수행합니다.
파일 전체 복구가 아닌 경우
오류가 특정 블록 손상으로 확인되고 데이터파일 전체가 손실되지 않았다면, 파일을 복원하는 대신 RMAN 블록 미디어 복구를 검토합니다. Oracle은 V$DATABASE_BLOCK_CORRUPTION과 진단 로그에서 손상 블록 정보를 확인한 뒤 RECOVER DATAFILE ... BLOCK ... 같은 형태로 대상 블록을 복구할 수 있습니다. 이 방식도 원인 분석, 백업 가용성, 영향 확인 없이 실행해서는 안 됩니다.
SELECT file#, block#, blocks, corruption_type
FROM v$database_block_corruption
ORDER BY file#, block#;
-- 예: 확인된 손상 블록만 대상으로 하는 RMAN 형식
RECOVER DATAFILE 7 BLOCK 1250;
블록 번호를 추측해 복구 명령을 실행하지 않습니다. 파일 자체가 사라졌거나 헤더를 읽지 못하는 문제라면 블록 복구가 해결책이 아닙니다. 반대로 단일 블록 손상에 파일 전체 RESTORE를 적용하면 불필요한 업무 중단과 복구 시간을 키울 수 있습니다.
자주 생기는 실수
- RESTORE와 RECOVER를 같은 뜻으로 여기는 일: 백업본을 되살린 뒤 redo 적용이 빠지면 파일은 최신 일관성 지점에 도달하지 못합니다.
- 파일 번호를 확인하지 않고 테이블스페이스 전체를 오프라인으로 두는 일: 영향 범위를 넓히고 불필요한 업무 중단을 만들 수 있습니다.
- RMAN 출력의 경고를 무시하고 ONLINE을 먼저 실행하는 일: 필요한 archived redo, 경로, 권한 문제를 더 복잡하게 만듭니다.
- 불완전 복구와 완전 복구를 섞는 일: 과거 시점 복구는 대상 범위와 OPEN RESETLOGS 같은 별도 결정이 필요합니다.
- 어제의 RESTORE VALIDATE 결과를 실제 복구 성공으로 해석하는 일: VALIDATE는 복구 계획과 백업 읽기를 확인하지만, 실제 파일 복원·redo 적용·업무 검증을 대신하지 않습니다.
복구 명령보다 먼저 복구 범위를 결정한다
특정 데이터파일 장애에서 가장 위험한 선택은 빠른 명령 하나를 찾는 일입니다. 먼저 파일 손상인지, 블록 손상인지, 일부 파일의 완전 복구인지, 과거 시점으로 되돌려야 하는 사고인지를 나눠야 합니다. 일부 파일의 완전 복구라는 판단이 확인되면 오프라인 전환, RESTORE, RECOVER, 상태 검증, ONLINE 순서가 업무 영향과 데이터 일관성을 함께 관리하는 기준선이 됩니다.