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

ORA-00607
2026년 06월 13일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-00607 internal error occurred while making a change to a data block 는?

ORA-00607은 Oracle 데이터베이스가 데이터 블록을 변경하는 과정에서 내부 오류가 발생했을 때 나타나는 에러입니다. 이 에러는 단독으로 발생하지 않고, 대부분 ORA-00600과 같은 내부 오류 코드와 함께 나타나며, 그 조합을 통해 실제 원인을 파악해야 합니다. 주로 데이터 블록 손상(Block Corruption), 메모리 이슈, 또는 Oracle 내부 버그 등으로 인해 발생하며, 방치할 경우 데이터 무결성 문제로 이어질 수 있어 신속한 대응이 필요합니다.


주요 발생 원인

  • 데이터 블록 손상 (Block Corruption)

데이터 파일이나 메모리(Buffer Cache) 상에서 블록이 물리적 또는 논리적으로 손상된 경우, DML 작업(INSERT, UPDATE, DELETE) 수행 중 ORA-00607이 발생할 수 있습니다. 손상된 블록에 변경을 가하려고 하면 Oracle 내부 처리 과정에서 일관성 검사를 통과하지 못해 에러가 트리거됩니다. 이 경우 ORA-01578(블록 손상 감지)이나 ORA-00600 에러가 함께 Alert 로그에 기록되는 경우가 많습니다.

  • Oracle 내부 버그 (Oracle Internal Bug)

특정 Oracle 버전에서 발생하는 알려진 내부 버그로 인해 데이터 블록 변경 과정에서 예상치 못한 오류가 발생할 수 있습니다. 이 경우 에러 메시지에 포함된 ORA-00600의 인자값(argument)이 핵심 단서가 되며, Oracle Support(MOS: My Oracle Support)에서 해당 버그 번호를 검색해야 합니다. 패치가 적용되지 않은 환경에서 특정 SQL 패턴이나 오브젝트 구조에 의해 반복적으로 발생하는 경향이 있습니다.

  • 하드웨어 또는 스토리지 I/O 문제

스토리지 레벨의 I/O 오류, 불량 메모리(RAM), 또는 디스크 컨트롤러 오류로 인해 데이터가 정상적으로 블록에 기록되지 않을 때 이 에러가 발생할 수 있습니다. Oracle은 블록 쓰기 시 체크섬(Checksum) 검증을 수행하는데, 하드웨어 문제로 인해 데이터가 변조되면 내부 오류로 처리됩니다. 이러한 경우는 OS 레벨의 시스템 로그(dmesg, /var/log/messages)에서도 I/O 에러가 함께 확인되는 경우가 많습니다.


해결 방법

1단계: Alert 로그 및 Trace 파일 확인

가장 먼저 Alert 로그를 확인하여 ORA-00607과 함께 발생한 ORA-00600의 인자값을 파악합니다.

-- Alert 로그 위치 확인
SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Diag Trace';

-- ADR (Automatic Diagnostic Repository) 기반 에러 조회
SELECT INCIDENT_ID, CREATE_TIME, ECID, ERROR_FACILITY, ERROR_NUMBER
FROM V$DIAG_INCIDENT
WHERE ERROR_NUMBER IN (607, 600)
ORDER BY CREATE_TIME DESC;

2단계: 손상된 블록 식별

-- DB_BLOCK_CHECKING 파라미터 확인
SHOW PARAMETER DB_BLOCK_CHECKING;

-- DBVERIFY를 통한 데이터 파일 검증 (OS 레벨 명령)
-- dbv FILE=/oradata/ORCL/users01.dbf BLOCKSIZE=8192 LOGFILE=/tmp/dbv_result.log

-- 손상된 세그먼트 조회 (V$DATABASE_BLOCK_CORRUPTION)
SELECT FILE#, BLOCK#, BLOCKS, CORRUPTION_TYPE
FROM V$DATABASE_BLOCK_CORRUPTION;

-- 손상된 블록이 속한 오브젝트 확인
SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE, PARTITION_NAME
FROM DBA_EXTENTS
WHERE FILE_ID = &file_id
  AND &block_id BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1;

3단계: RMAN을 이용한 블록 복구

-- RMAN 접속 후 블록 단위 복구
-- rman TARGET /

-- 특정 블록 복구
BLOCKRECOVER DATAFILE 5 BLOCK 123;

-- 자동으로 손상된 블록 전체 복구
BLOCKRECOVER CORRUPTION LIST;

-- 백업이 없는 경우: DBMS_REPAIR 패키지를 이용한 처리
BEGIN
  DBMS_REPAIR.CHECK_OBJECT(
    SCHEMA_NAME => 'SCOTT',
    OBJECT_NAME => 'EMP',
    REPAIR_TABLE_NAME => 'REPAIR_TABLE'
  );
END;
/

-- 손상 블록을 건너뛰고 데이터 추출 (최후 수단)
ALTER SESSION SET DB_FILE_CORRUPT_THRESHOLD = 10;

-- 손상 블록 마킹 후 스킵 처리
BEGIN
  DBMS_REPAIR.FIX_CORRUPT_BLOCKS(
    SCHEMA_NAME => 'SCOTT',
    OBJECT_NAME => 'EMP'
  );
END;
/

4단계: 데이터 재생성 (블록 복구 불가 시)

-- 손상된 테이블의 데이터를 새 테이블로 이관
CREATE TABLE emp_backup AS
SELECT /*+ FULL(e) */ *
FROM scott.emp e
WHERE ROWID NOT IN (
  SELECT ROWID FROM scott.emp
  WHERE ... -- 손상된 블록 제외 조건
);

-- 원본 테이블 제거 후 재생성
DROP TABLE scott.emp;
RENAME emp_backup TO emp;

-- 인덱스 재생성
ALTER INDEX scott.emp_pk REBUILD;

5단계: Oracle Patch 적용 (내부 버그인 경우)

ORA-00600의 인자값을 My Oracle Support(support.oracle.com)에서 검색하여 해당하는 버그 번호를 확인하고, 권장 PSU(Patch Set Update) 또는 One-off Patch를 적용합니다.

-- 현재 Oracle 버전 및 적용된 패치 확인
SELECT * FROM V$VERSION;

-- 적용된 패치 목록 (DBA_REGISTRY_SQLPATCH)
SELECT PATCH_ID, PATCH_UID, VERSION, ACTION, STATUS, DESCRIPTION
FROM DBA_REGISTRY_SQLPATCH
ORDER BY ACTION_TIME DESC;

예방 방법

  • 정기적인 데이터 무결성 점검 및 백업 전략 수립

DB_BLOCK_CHECKING 파라미터를 FULL 또는 MEDIUM으로 설정하여 블록 변경 시마다 무결성 검사를 수행하도록 합니다. 또한 DB_BLOCK_CHECKSUM을 FULL로 설정하면 블록을 디스크에 쓸 때 체크섬을 계산하여 I/O 오류를 조기에 감지할 수 있습니다. RMAN을 이용한 정기 백업(일 1회 이상)과 함께 BACKUP VALIDATE CHECK LOGICAL DATABASE를 주기적으로 실행하여 논리적 블록 손상을 사전에 탐지하는 루틴을 구축하세요.

“`sql

— 블록 체크 파라미터 설정 (재기동 불필요)

ALTER SYSTEM SET DB_BLOCK_CHECKING = MEDIUM SCOPE=BOTH;

ALTER SYSTEM SET DB_BLOCK_CHECKSUM = FULL SCOPE=BOTH;

— RMAN을 이용한 논리적 검증 (정기 스케줄 권장)

— BACKUP VALIDATE CHECK LOGICAL DATABASE;

“`

  • Oracle 패치를 최신 상태로 유지 및 모니터링 체계 구축

Oracle CPU(Critical Patch Update) 및 PSU를 분기별로 검토하고 테스트 환경에서 검증 후 운영 환경에 적용하는 프로세스를 표준화합니다. Alert 로그를 실시간으로 모니터링하는 스크립트 또는 Oracle Enterprise Manager(OEM)의 알림 기능을 활용하여 ORA-006xx 계열 에러 발생 시 즉각 대응할 수 있는 체계를 갖추세요.

“`sql

— Alert 로그 실시간 모니터링용 뷰 활용

SELECT ORIGINATING_TIMESTAMP, MESSAGE_TEXT

FROM V$DIAG_ALERT_EXT

WHERE MESSAGE_TEXT LIKE ‘%ORA-006%’

AND ORIGINATING_TIMESTAMP > SYSDATE – 1/24

ORDER BY ORIGINATING_TIMESTAMP DESC;

“`


관련 에러

  • ORA-00600: Oracle 내부 오류의 대표 코드로, ORA-00607과 거의 항상 함께 발생합니다. ORA-00600의 첫 번째 인자값이 실제 원인 분석의 핵심 단서입니다.
  • ORA-01578: 데이터 블록 손상이 실제로 감지되었을 때 발생하는 에러로, ORA-00607과 함께 발생 시 블록 손상이 근본 원인임을 강하게 시사합니다.
  • ORA-01110: 손상된 데이터 파일의 이름과 번호를 함께 알려주는 에러로, 복구 대상 파일을 특정하는 데 활용됩니다.
  • ORA-00376: 데이터 파일을 현재 읽을 수 없는 상태일 때 발생하며, 파일 레벨 손상과 연관되어 ORA-00607과 동반될 수 있습니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기