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

ORA-16005
2026년 09월 27일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-16005 database requires recovery 는?

ORA-16005 에러는 Oracle 데이터베이스가 정상적인 운영 상태로 전환되기 위해 복구(Recovery) 작업이 필요한 상태임을 나타내는 에러입니다. 주로 Oracle Data Guard 환경이나 Standby 데이터베이스를 운영하는 환경에서 발생하며, 데이터베이스가 완전히 동기화되지 않았거나 비정상적인 종료 이후 미완료된 트랜잭션이 남아 있을 때 나타납니다. 이 에러는 데이터베이스를 OPEN 상태로 전환하려 할 때 Oracle이 먼저 복구 프로세스의 완료를 요구하면서 발생하며, 방치할 경우 데이터 무결성에 심각한 위험을 초래할 수 있습니다.


주요 발생 원인

1. Standby 데이터베이스에서 Redo Log 적용 미완료

Oracle Data Guard 환경에서 Standby 데이터베이스는 Primary로부터 수신한 Redo Log를 지속적으로 적용해야 합니다. MRP(Managed Recovery Process)가 중단되거나, Primary로부터 Redo 데이터 수신이 지연/중단된 상태에서 강제로 데이터베이스를 OPEN하려 할 경우 ORA-16005 에러가 발생합니다. 즉, 복구되지 않은 Redo 데이터가 남아 있는 상태에서 Open 명령을 수행할 때 Oracle이 이를 차단하는 것입니다.

2. 비정상적인 데이터베이스 종료로 인한 미완료 트랜잭션

데이터베이스가 SHUTDOWN ABORT나 시스템 장애(서버 강제 종료, 전원 이상 등)로 인해 비정상 종료된 경우, 미완료 트랜잭션(Uncommitted Transaction)과 커밋되지 않은 Redo 데이터가 Online Redo Log에 남아 있을 수 있습니다. Oracle은 이를 자동으로 감지하고, 데이터베이스를 OPEN 상태로 올리기 전에 Instance Recovery(인스턴스 복구)를 요구합니다. 일반적인 Primary 데이터베이스에서는 STARTUP 시 자동으로 처리되나, Standby 환경에서는 수동 개입이 필요한 경우가 많습니다.

3. RESETLOGS 이후 Standby와 Primary 간 SCN 불일치

Primary 데이터베이스에서 불완전 복구(Incomplete Recovery) 후 RESETLOGS 옵션으로 OPEN한 경우, Standby 데이터베이스의 SCN(System Change Number) 정보와 일치하지 않게 됩니다. 이 상태에서 Standby 데이터베이스를 재동기화 없이 무리하게 OPEN하려 할 때 ORA-16005 에러가 발생합니다. 반드시 Standby 데이터베이스를 재구성하거나 Flashback Database 등을 활용하여 SCN을 맞춰 주어야 합니다.


해결 방법

해결책 1: Standby DB에서 MRP 재시작 및 Redo 적용 완료

Standby 데이터베이스에서 MRP 프로세스를 재시작하고 모든 Redo Log가 적용될 때까지 대기합니다.

-- 현재 MRP 상태 확인
SELECT PROCESS, STATUS, SEQUENCE#, BLOCK#, BLOCKS
FROM V$MANAGED_STANDBY;

-- MRP 중지 (이미 실행 중인 경우 먼저 중지)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- MRP 재시작 (Real-Time Apply 포함)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
USING CURRENT LOGFILE DISCONNECT FROM SESSION;

-- 적용 현황 및 Gap 확인
SELECT * FROM V$ARCHIVE_GAP;

-- Primary와 Standby 간 SCN 동기화 확인
SELECT CURRENT_SCN FROM V$DATABASE;

-- Redo 적용 완료 후 Read Only 모드로 오픈 (필요 시)
ALTER DATABASE OPEN READ ONLY;

해결책 2: 비정상 종료 이후 Instance Recovery 수행

Primary 또는 Standby 데이터베이스가 비정상 종료된 경우, 아래 절차로 복구를 진행합니다.

-- MOUNT 상태에서 데이터베이스 복구 수행
STARTUP MOUNT;

-- 자동 복구 시도
RECOVER DATABASE;

-- 또는 특정 아카이브 로그를 지정하여 복구
RECOVER DATABASE UNTIL CANCEL;

-- Auto Apply 옵션으로 복구 (대화형 없이)
RECOVER AUTOMATIC DATABASE;

-- 복구 완료 후 RESETLOGS 없이 OPEN (완전 복구 시)
ALTER DATABASE OPEN;

-- 불완전 복구인 경우 RESETLOGS 옵션 사용
ALTER DATABASE OPEN RESETLOGS;

해결책 3: SCN 불일치 해결 – Flashback 또는 Standby 재구성

RESETLOGS 이후 SCN 불일치가 발생한 경우, Flashback Database를 이용하여 복구합니다.

-- Primary에서 RESETLOGS SCN 확인
SELECT RESETLOGS_CHANGE#, RESETLOGS_TIME FROM V$DATABASE;

-- Standby에서 현재 SCN 확인
SELECT CURRENT_SCN, DB_UNIQUE_NAME FROM V$DATABASE;

-- Flashback을 이용한 Standby 복구 (Flashback이 활성화된 경우)
-- Standby DB를 MOUNT 상태로
STARTUP MOUNT;

-- Primary의 RESETLOGS SCN 이전 시점으로 Flashback
FLASHBACK DATABASE TO SCN <resetlogs_scn - 1>;

-- Standby 복구 재시작
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
USING CURRENT LOGFILE DISCONNECT FROM SESSION;

-- Data Guard 상태 전체 확인
SELECT DB_UNIQUE_NAME, OPEN_MODE, DATABASE_ROLE,
       PROTECTION_MODE, SWITCHOVER_STATUS
FROM V$DATABASE;

-- Archive Log Gap 상태 확인
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE#
FROM V$ARCHIVE_GAP;

해결책 4: Standby를 OPEN RESETLOGS로 강제 오픈 (최후 수단)

복구가 불가능하고 Standby 데이터베이스를 독립적으로 사용해야 하는 경우의 최후 수단입니다. 단, 이 방법은 Data Guard 구성이 깨지므로 신중하게 사용해야 합니다.

-- 복구 취소
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- 현재까지의 Redo 적용
RECOVER DATABASE UNTIL CANCEL;

-- Standby를 Primary로 전환 후 OPEN
ALTER DATABASE ACTIVATE STANDBY DATABASE;

ALTER DATABASE OPEN;

-- 이후 Data Guard 재구성 필요
-- 상태 최종 확인
SELECT NAME, DB_UNIQUE_NAME, DATABASE_ROLE,
       OPEN_MODE, PROTECTION_MODE
FROM V$DATABASE;

예방 방법

1. Data Guard 환경의 정기적인 상태 모니터링 자동화

ORA-16005 에러를 예방하기 위한 가장 효과적인 방법은 Data Guard 환경의 MRP 상태와 Archive Log Gap을 주기적으로 모니터링하는 스크립트를 자동화하는 것입니다. 아래와 같이 정기 모니터링 스크립트를 cron 또는 Oracle Scheduler에 등록하여 이상 감지 시 즉각 알람이 발생하도록 설정하세요. 특히 MRP 프로세스가 예상치 않게 중단되거나 Archive Log Gap이 발생할 경우 즉시 DBA에게 통보될 수 있도록 운영 체계를 갖추는 것이 핵심입니다.

-- 모니터링 쿼리 예시 (Standby DB에서 실행)
SELECT
    (SELECT DB_UNIQUE_NAME FROM V$DATABASE) AS DB_NAME,
    PROCESS,
    STATUS,
    SEQUENCE#,
    TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS CHECK_TIME
FROM V$MANAGED_STANDBY
WHERE PROCESS IN ('MRP0', 'RFS')
UNION ALL
SELECT
    (SELECT DB_UNIQUE_NAME FROM V$DATABASE),
    'ARCHIVE_GAP',
    'GAP_DETECTED',
    HIGH_SEQUENCE#,
    TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')
FROM V$ARCHIVE_GAP;

2. 정기적인 Flashback Database 활성화 및 복구 시나리오 훈련

운영 환경에서 Flashback Database 기능을 반드시 활성화하여 SCN 불일치나 예상치 못한 복구 시나리오에 빠르게 대응할 수 있도록 준비하십시오. 또한 분기별로 실제 Standby 데이터베이스 Switchover/Failover 훈련을 수행하여, 장애 발생 시 ORA-16005와 같은 에러를 신속하게 처리할 수 있는 역량을 팀 전체가 갖추도록 해야 합니다. Flashback Retention Target을 충분히 설정하는 것도 중요합니다.

-- Flashback Database 활성화 여부 확인
SELECT FLASHBACK_ON FROM V$DATABASE;

-- Flashback Database 활성화 (MOUNT 상태에서)
ALTER DATABASE FLASHBACK ON;

-- Flashback Retention 설정 (분 단위, 예: 2880분 = 2일)
ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET = 2880;

관련 에러

  • ORA-01113: 데이터파일에 미디어 복구가 필요한 상태. ORA-16005와 함께 발생하는 경우가 많으며, 특정 데이터파일의 복구가 완료되지 않았음을 나타냅니다.
  • ORA-01194: 데이터파일이 일관된 상태가 아니므로 더 많은 복구가 필요함을 나타내는 에러로, Incomplete Recovery 이후 자주 동반됩니다.
  • ORA-10458: Standby 데이터베이스가 Primary로부터 분리된 상태임을 알리는 에러로, ORA-16005 발생 전조 증상으로 나타날 수 있습니다.
  • ORA-16014: Archive Log가 더 이상 사용 가능하지 않거나 목적지에 기록되지 않는 상황으로, Standby 복구에 영향을 줍니다.
  • ORA-00283: 복구 세션이 에러로 인해 취소되었음을 나타내며, ORA-16005 발생 시 함께 로그에 기록되는 경우가 많습니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기