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

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

이 글에서 다루는 내용

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

ORA-00600 internal error code, arguments 는?

ORA-00600은 Oracle 데이터베이스 내부에서 예상치 못한 상황이 발생했을 때 Oracle 커널이 스스로 감지하고 던지는 내부 오류 코드입니다. 일반적인 SQL 문법 오류나 권한 문제와 달리, 이 에러는 Oracle 엔진 내부의 코드 레벨 이상 현상을 의미하며 Oracle Support(MOS)의 개입이 필요한 경우가 많습니다. 에러 메시지에 포함된 대괄호 안의 인수값(arguments)이 원인 분석의 핵심 단서가 되므로, 반드시 alert log와 trace 파일을 함께 확인해야 합니다.


주요 발생 원인

1. Oracle 버그 또는 패치 누락

Oracle 소프트웨어 자체에 존재하는 버그로 인해 특정 SQL 실행 경로나 내부 함수 호출 시 ORA-00600이 발생할 수 있습니다. 특히 패치셋(PSU/RU) 적용이 오래된 환경에서는 이미 알려진 버그가 수정되지 않은 채로 남아 있을 가능성이 높습니다. Oracle MOS(My Oracle Support)에서 에러 인수값으로 검색하면 관련 버그 번호와 패치를 확인할 수 있습니다.

2. 데이터 블록 손상(Data Block Corruption)

데이터 파일의 물리적 또는 논리적 블록이 손상된 경우, 해당 블록을 읽거나 쓰는 과정에서 Oracle 내부 검증 로직이 ORA-00600을 발생시킵니다. 스토리지 장애, 잘못된 I/O 처리, 불완전한 백업 복구 등이 블록 손상의 주요 원인입니다. 이 경우 RMAN의 VALIDATE 또는 BACKUP VALIDATE 명령으로 손상 여부를 먼저 확인해야 합니다.

3. SGA/메모리 오염(Memory Corruption)

Shared Pool, Buffer Cache 등 SGA 영역의 메모리가 오염되면 Oracle이 내부적으로 잘못된 포인터나 데이터를 참조하면서 ORA-00600이 발생할 수 있습니다. OS 레벨의 메모리 불안정, 잘못된 _ 언더스코어 파라미터 설정, 또는 과도한 메모리 압박이 이 문제를 유발하는 경우가 많습니다. 인스턴스를 재기동하면 일시적으로 해소되지만, 근본 원인을 해결하지 않으면 반복 발생합니다.


해결 방법

1단계: Alert Log 및 Trace 파일 확인

-- alert log 위치 확인
SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Diag Trace';

-- 최근 ORA-00600 에러 발생 이력 조회
SELECT ORIGINATING_TIMESTAMP, MESSAGE_TEXT
FROM   V$DIAG_ALERT_EXT
WHERE  MESSAGE_TEXT LIKE '%ORA-00600%'
ORDER  BY ORIGINATING_TIMESTAMP DESC
FETCH  FIRST 20 ROWS ONLY;

2단계: 데이터 블록 손상 여부 확인 및 복구

-- RMAN을 통한 데이터파일 유효성 검사
-- RMAN 프롬프트에서 실행
BACKUP VALIDATE CHECK LOGICAL DATABASE;

-- 손상된 블록 확인
SELECT FILE#, BLOCK#, BLOCKS, CORRUPTION_TYPE
FROM   V$DATABASE_BLOCK_CORRUPTION
ORDER  BY FILE#, BLOCK#;

-- 손상된 블록 복구 (RMAN)
-- RMAN> RECOVER CORRUPTION LIST;

-- 특정 테이블의 블록 손상 확인 (DBMS_REPAIR 활용)
BEGIN
  DBMS_REPAIR.CHECK_OBJECT(
    schema_name => 'SCOTT',
    object_name => 'EMP',
    repair_table_name => 'REPAIR_TABLE'
  );
END;
/

3단계: 문제 SQL 특정 및 우회

-- 문제가 되는 SQL의 실행 계획 확인
EXPLAIN PLAN FOR
SELECT /*+ NO_MERGE */ *
FROM   your_problematic_table
WHERE  your_condition = 'value';

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

-- 힌트를 활용한 실행 계획 우회 (예: Full Scan 강제)
SELECT /*+ FULL(t) */ *
FROM   your_problematic_table t
WHERE  your_condition = 'value';

-- 특정 기능 비활성화 (임시 조치, 반드시 Oracle Support 확인 후 적용)
ALTER SESSION SET "_optimizer_null_aware_antijoin" = FALSE;
ALTER SESSION SET "_complex_view_merging" = FALSE;

4단계: 메모리 관련 진단

-- SGA 구성 현황 확인
SELECT COMPONENT, CURRENT_SIZE/1024/1024 AS SIZE_MB, 
       LAST_OPER_TYPE, LAST_OPER_MODE
FROM   V$SGA_DYNAMIC_COMPONENTS
ORDER  BY CURRENT_SIZE DESC;

-- Shared Pool 단편화 확인
SELECT POOL, NAME, BYTES/1024/1024 AS MB
FROM   V$SGASTAT
WHERE  POOL = 'shared pool'
ORDER  BY BYTES DESC
FETCH  FIRST 10 ROWS ONLY;

-- Shared Pool 플러시 (임시 조치)
ALTER SYSTEM FLUSH SHARED_POOL;
ALTER SYSTEM FLUSH BUFFER_CACHE;

5단계: Oracle MOS 서비스 요청 전 필수 수집 정보

-- DB 버전 및 패치 이력 확인
SELECT * FROM V$VERSION;
SELECT * FROM DBA_REGISTRY_SQLPATCH ORDER BY ACTION_TIME DESC;

-- 인스턴스 파라미터 덤프 (non-default 파라미터만)
SELECT NAME, VALUE, DESCRIPTION
FROM   V$PARAMETER
WHERE  ISDEFAULT = 'FALSE'
ORDER  BY NAME;

예방 방법

1. 정기적인 패치 적용 및 블록 무결성 점검 자동화

Oracle에서 분기별로 배포하는 Release Update(RU) 또는 Patch Set Update(PSU)를 주기적으로 적용하여 알려진 버그를 선제적으로 제거하는 것이 가장 효과적인 예방책입니다. 또한 RMAN 스케줄을 통해 매주 BACKUP VALIDATE CHECK LOGICAL DATABASE를 실행하고, V$DATABASE_BLOCK_CORRUPTION 뷰를 모니터링하는 자동화 스크립트를 구성하면 블록 손상을 조기에 감지할 수 있습니다.

-- 블록 손상 모니터링 자동화 예시 (매일 실행하는 점검 쿼리)
SELECT SYSDATE AS CHECK_TIME,
       COUNT(*) AS CORRUPTED_BLOCKS
FROM   V$DATABASE_BLOCK_CORRUPTION;

2. AWR/Alert Log 기반 이상 징후 사전 감지 체계 구축

ORA-00600은 갑작스럽게 발생하는 것처럼 보이지만, 실제로는 발생 전 alert log에 관련 경고 메시지나 다른 내부 에러가 먼저 기록되는 경우가 많습니다. V$DIAG_ALERT_EXT 또는 ADRCI(Automatic Diagnostic Repository Command Interpreter) 도구를 활용하여 alert log를 주기적으로 모니터링하고, ORA- 에러 발생 빈도를 추적하는 모니터링 체계를 사전에 구축해 두어야 합니다.


관련 에러

  • ORA-00700: soft internal error로, ORA-00600보다 심각도가 낮은 내부 경고 에러입니다.
  • ORA-07445: 운영체제 레벨의 프로세스 예외(access violation, segmentation fault 등)로 발생하며, ORA-00600과 함께 alert log에 나타나는 경우가 많습니다. 두 에러 모두 trace 파일 분석과 Oracle Support 케이스 오픈이 필요합니다.
  • ORA-01578: 데이터 블록 손상이 직접적인 원인인 경우 ORA-00600과 함께 동반 발생하는 대표적인 에러입니다.
  • ORA-04031: Shared Pool 메모리 부족으로 발생하며, 심각한 메모리 단편화 상황에서는 ORA-00600으로 이어질 수 있습니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기