2026년 06월 10일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00368 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00368 checksum error in redo log block 는?
ORA-00368 에러는 Oracle의 Redo Log 블록에서 체크섬(Checksum) 불일치가 감지되었을 때 발생하는 에러입니다. Oracle은 Redo Log에 데이터를 기록할 때 각 블록마다 체크섬 값을 함께 저장하는데, 이후 해당 블록을 읽는 과정에서 체크섬이 맞지 않으면 데이터 무결성 문제로 판단하고 이 에러를 발생시킵니다. 주로 디스크 I/O 오류, 하드웨어 결함, 또는 OS 레벨의 파일 손상 등 심각한 물리적 문제와 연관되어 있어, 즉각적인 조치가 필요한 Critical 에러입니다.
주요 발생 원인
1. 디스크/스토리지 하드웨어 결함
가장 흔한 원인으로, 스토리지 장치의 물리적 결함이나 불안정한 I/O 서브시스템이 Redo Log 블록의 데이터를 손상시킵니다. RAID 컨트롤러 오작동, 디스크 배드 섹터, HBA(Host Bus Adapter) 문제 등이 실제 현장에서 자주 확인되는 원인입니다. 특히 엔터프라이즈 환경에서 스토리지 펌웨어 업데이트 이후 이 문제가 발생하는 사례가 보고되고 있습니다.
2. OS 또는 파일 시스템 수준의 파일 손상
운영체제의 파일 시스템 버그, 비정상 종료(Power failure), 또는 OS 패닉(Kernel Panic) 상황에서 Redo Log 파일에 불완전한 쓰기가 발생할 수 있습니다. NFS 마운트된 스토리지를 사용하는 환경에서는 네트워크 불안정으로 인해 블록이 깨지는 경우도 있습니다. 파일 시스템이 ext4, xfs 등을 사용하더라도 저널링이 정상 완료되지 않으면 블록 레벨에서 손상이 발생할 수 있습니다.
3. Oracle 파라미터 또는 패치 관련 버그
DB_BLOCK_CHECKSUM 또는 DB_LOST_WRITE_PROTECT 파라미터의 설정 변경이나 Oracle 패치 적용 과정에서 내부 메모리 연산 오류로 인해 잘못된 체크섬이 기록되는 버그가 존재합니다. 특히 특정 Oracle 버전(예: 11.2.0.3, 12.1.0.1)에서 알려진 버그가 보고된 바 있으므로, MOS(My Oracle Support)에서 관련 패치를 확인하는 것이 중요합니다. 운영 환경에서 파라미터를 임의로 변경하지 않도록 변경 관리 프로세스를 철저히 준수해야 합니다.
해결 방법
1단계: 현재 Redo Log 상태 확인
먼저 문제가 발생한 Redo Log 그룹과 멤버를 확인합니다.
-- 현재 Redo Log 그룹 및 상태 확인
SELECT GROUP#, SEQUENCE#, STATUS, ARCHIVED, MEMBERS
FROM V$LOG
ORDER BY GROUP#;
-- Redo Log 멤버 파일 경로 및 상태 확인
SELECT GROUP#, MEMBER, STATUS
FROM V$LOGFILE
ORDER BY GROUP#, MEMBER;
-- 손상된 블록 정보 확인 (alert log와 연계)
SELECT * FROM V$LOG_HISTORY
WHERE FIRST_TIME > SYSDATE - 1
ORDER BY FIRST_TIME DESC;
2단계: 손상된 Redo Log가 CURRENT가 아닌 경우 — Log Switch 수행
손상된 로그 그룹이 INACTIVE 또는 UNUSED 상태라면 해당 그룹을 초기화하고 재생성합니다.
-- 현재 Active/Current 로그 그룹 확인
SELECT GROUP#, STATUS FROM V$LOG;
-- 손상된 그룹이 INACTIVE인 경우, 해당 그룹의 멤버 삭제 후 재추가
ALTER DATABASE DROP LOGFILE GROUP 2;
-- 새로운 로그 파일 멤버 추가 (경로는 환경에 맞게 수정)
ALTER DATABASE ADD LOGFILE GROUP 2
('/oradata/redo02a.log', '/oradata/redo02b.log') SIZE 200M;
-- 강제 로그 스위치로 LGWR가 새 그룹으로 이동하도록 유도
ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM CHECKPOINT;
3단계: 손상된 Redo Log가 CURRENT인 경우 — 긴급 복구
가장 심각한 경우로, 현재 사용 중인 Redo Log가 손상된 상황입니다.
-- DB가 MOUNT 상태일 때만 시도 가능
-- 먼저 DB 정상 종료 후 재시작
SHUTDOWN ABORT;
STARTUP MOUNT;
-- 손상된 Current 로그를 강제로 Clear (데이터 손실 가능성 있음)
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 1;
-- 아카이브 로그가 필요한 경우 (Archivelog mode에서)
ALTER DATABASE CLEAR LOGFILE GROUP 1;
-- DB 오픈 시도
ALTER DATABASE OPEN;
> ⚠️ 주의: CLEAR UNARCHIVED LOGFILE은 해당 Redo Log의 미반영 트랜잭션을 포기하는 것을 의미하므로, 반드시 RMAN 백업 상태를 먼저 확인하고 수행하십시오.
4단계: RMAN을 통한 미디어 복구
위의 방법으로 해결되지 않는다면 RMAN 복구를 수행합니다.
-- RMAN 접속 후 복구 수행
-- (OS 명령어로 RMAN 실행)
-- rman target /
-- RMAN 내에서 복구 명령
RESTORE DATABASE;
RECOVER DATABASE;
-- 특정 시점으로 불완전 복구 (PITR)
RUN {
SET UNTIL TIME "TO_DATE('2024-01-15 10:00:00', 'YYYY-MM-DD HH24:MI:SS')";
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
}
5단계: 체크섬 파라미터 확인 및 조정
-- 현재 체크섬 관련 파라미터 확인
SHOW PARAMETER DB_BLOCK_CHECKSUM;
SHOW PARAMETER DB_LOST_WRITE_PROTECT;
-- 체크섬 활성화 (권장 설정: TYPICAL 또는 FULL)
ALTER SYSTEM SET DB_BLOCK_CHECKSUM = TYPICAL SCOPE=BOTH;
ALTER SYSTEM SET DB_LOST_WRITE_PROTECT = TYPICAL SCOPE=BOTH;
-- Redo Log 체크섬 검증 파라미터 (Oracle 11g 이상)
SHOW PARAMETER DB_BLOCK_CHECKING;
ALTER SYSTEM SET DB_BLOCK_CHECKING = MEDIUM SCOPE=BOTH;
예방 방법
1. Redo Log 다중화(Multiplexing) 및 정기적인 무결성 검사
Redo Log 그룹당 최소 2개 이상의 멤버를 서로 다른 물리적 디스크에 배치하여, 하나의 멤버가 손상되더라도 다른 멤버로 운영이 지속될 수 있도록 구성합니다. 또한 Oracle의 DB_BLOCK_CHECKSUM 파라미터를 TYPICAL 이상으로 설정하고, 정기적으로 DBVERIFY 유틸리티와 RMAN VALIDATE 명령을 통해 Redo Log 및 데이터파일의 무결성을 주기적으로 점검하는 루틴을 구축하는 것이 필수적입니다.
-- Redo Log 그룹에 멤버 추가 (다중화 예시)
ALTER DATABASE ADD LOGFILE MEMBER '/oradata2/redo01b.log' TO GROUP 1;
ALTER DATABASE ADD LOGFILE MEMBER '/oradata2/redo02b.log' TO GROUP 2;
ALTER DATABASE ADD LOGFILE MEMBER '/oradata2/redo03b.log' TO GROUP 3;
-- RMAN을 통한 정기 백업 및 검증 스크립트
-- (cron 또는 Oracle Scheduler로 자동화 권장)
BACKUP VALIDATE DATABASE ARCHIVELOG ALL;
2. 모니터링 자동화 및 Alert Log 실시간 감시
ORA-00368 에러는 발생 즉시 Oracle Alert Log에 기록되므로, 실시간 Alert Log 모니터링 시스템을 구축해야 합니다. Oracle Enterprise Manager(OEM), Zabbix, 또는 자체 쉘 스크립트를 활용하여 Alert Log에서 ORA- 에러를 자동 감지하고 DBA에게 즉시 알림이 전달되도록 설정합니다. 아울러 스토리지 레이어에서의 I/O 오류 모니터링도 병행하여 하드웨어 이상 징후를 사전에 감지하는 것이 중요합니다.
-- Oracle Scheduler를 활용한 Redo Log 상태 모니터링 Job 생성 예시
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'MONITOR_REDO_LOG_STATUS',
job_type => 'PLSQL_BLOCK',
job_action => '
DECLARE
v_cnt NUMBER;
BEGIN
SELECT COUNT(*) INTO v_cnt
FROM V$LOG
WHERE STATUS = ''INACTIVE''
AND ARCHIVED = ''NO'';
IF v_cnt > 0 THEN
-- 알림 발송 로직 (DBMS_ALERT 또는 외부 연동)
DBMS_ALERT.SIGNAL(''REDO_LOG_ALERT'',
''Unarchived INACTIVE redo log detected: '' || v_cnt);
END IF;
END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=MINUTELY;INTERVAL=15',
enabled => TRUE,
comments => 'Monitor redo log status every 15 minutes'
);
END;
/
관련 에러
- ORA-00367: Redo Log 파일 헤더의 체크섬 오류로, ORA-00368과 유사하지만 블록이 아닌 파일 헤더 수준에서 발생합니다.
- ORA-00333: Redo Log를 읽는 도중 발생하는 일반적인 읽기 오류로, ORA-00368과 함께 나타나는 경우가 많습니다.
- ORA-00334: 아카이브된 Redo Log에서 체크섬 오류가 발생한 경우로, 주로 Recovery 과정에서 나타납니다.
- ORA-01578: 데이터 파일 블록의 손상을 나타내는 에러로, Redo Log 손상과 동반 발생하는 경우 전반적인 스토리지 문제를 의심해야 합니다.
- ORA-00600: Internal 에러로, 심각한 Redo Log 손상이 진행될 때 ORA-00368 이후 연쇄적으로 발생할 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.