2026년 06월 09일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00345 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00345 redo log write error block count 는?
ORA-00345 에러는 Oracle 데이터베이스가 Redo Log 파일에 데이터를 기록하는 과정에서 블록 수(block count)와 관련된 쓰기 오류가 발생했을 때 나타납니다. 이 에러는 일반적으로 OS 레벨의 I/O 서브시스템 오류, 디스크 손상, 또는 Redo Log 파일 자체의 물리적 문제에서 기인합니다. 데이터베이스의 핵심 복구 메커니즘인 Redo Log에 쓰기 실패가 발생하면 트랜잭션 무결성에 심각한 위협이 될 수 있으므로 즉각적인 조치가 필요합니다.
주요 발생 원인
1. 디스크 I/O 장애 또는 물리적 미디어 손상
가장 흔한 원인으로, Redo Log 파일이 위치한 디스크 장치에 물리적 결함이 발생하거나 스토리지 컨트롤러 레벨에서 I/O 오류가 발생할 때 나타납니다. 특히 SAN(Storage Area Network) 또는 NAS 환경에서 네트워크 단절이나 HBA(Host Bus Adapter) 오류로 인해 쓰기 요청이 정상적으로 완료되지 않는 경우가 빈번하게 보고됩니다. 운영 체제의 /var/log/messages 또는 이벤트 뷰어에서 디스크 관련 하드웨어 오류 메시지를 함께 확인해야 합니다.
2. Redo Log 파일 그룹의 멤버 파일 접근 불가
Oracle은 Redo Log를 다중화(Multiplexing)하여 여러 멤버로 운영하는데, 특정 멤버 파일이 삭제되거나 권한 문제로 접근이 불가능해진 경우에도 이 에러가 발생합니다. OS 레벨에서 실수로 Redo Log 파일을 삭제하거나 파일 시스템이 가득 차(Filesystem Full) 기록 자체가 불가능한 상황이 대표적입니다. 이 경우 V$LOGFILE 뷰를 조회하면 해당 멤버의 STATUS 컬럼이 INVALID 또는 STALE로 표시되는 것을 확인할 수 있습니다.
3. 파일 시스템 공간 부족(Filesystem Full)
Redo Log 파일이 위치한 파티션의 디스크 공간이 부족하여 OS가 추가적인 블록 쓰기를 거부하는 상황입니다. Archive Log Mode로 운영 중인 데이터베이스에서 Archive 대상 디렉토리가 가득 찰 경우, 연쇄적으로 Redo Log 전환(Log Switch)이 불가능해지고 결국 현재 Online Redo Log에 쓰기 오류가 발생합니다. df -h 명령어로 즉시 디스크 사용량을 점검하고 Archive Log 파일을 정리하거나 백업 후 삭제해야 합니다.
해결 방법
Step 1: 현재 Redo Log 상태 확인
-- Online Redo Log 그룹 및 멤버 상태 확인
SELECT
l.GROUP#,
l.MEMBERS,
l.BYTES / 1024 / 1024 AS SIZE_MB,
l.STATUS,
l.ARCHIVED,
lf.MEMBER,
lf.STATUS AS MEMBER_STATUS
FROM
V$LOG l
JOIN V$LOGFILE lf ON l.GROUP# = lf.GROUP#
ORDER BY
l.GROUP#, lf.MEMBER;
Step 2: 손상된 Redo Log 멤버 재생성
특정 멤버가 INVALID 상태라면 해당 멤버를 제거하고 새로운 경로에 추가합니다.
-- 손상된 멤버 확인 후 삭제
ALTER DATABASE DROP LOGFILE MEMBER '/old_path/redo01a.log';
-- 정상 경로에 새 멤버 추가
ALTER DATABASE ADD LOGFILE MEMBER '/new_path/redo01a.log'
TO GROUP 1;
-- 멤버 상태 재확인
SELECT GROUP#, MEMBER, STATUS
FROM V$LOGFILE
ORDER BY GROUP#;
Step 3: Redo Log 그룹 전체 교체 (그룹 자체가 손상된 경우)
-- 현재 사용 중이 아닌 그룹을 삭제하고 재생성
-- (CURRENT 상태의 그룹은 삭제 불가 - Log Switch 후 처리)
-- 강제 Log Switch 수행
ALTER SYSTEM SWITCH LOGFILE;
-- Checkpoint 완료 대기
ALTER SYSTEM CHECKPOINT;
-- 문제 그룹 삭제
ALTER DATABASE DROP LOGFILE GROUP 2;
-- 새 그룹 추가 (적절한 크기와 다중 경로 지정)
ALTER DATABASE ADD LOGFILE GROUP 2 (
'/disk1/oradata/redo02a.log',
'/disk2/oradata/redo02b.log'
) SIZE 500M;
Step 4: Archive Log 공간 정리 (공간 부족 시)
-- Archive Log 현황 확인
SELECT
DEST_ID,
DEST_NAME,
STATUS,
TARGET,
ARCHIVER,
SCHEDULE,
DESTINATION
FROM V$ARCHIVE_DEST
WHERE STATUS = 'VALID';
-- RMAN을 통한 Archive Log 정리
-- (RMAN 프롬프트에서 실행)
-- RMAN에서 백업 후 삭제
RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT;
-- 또는 특정 기간 이전 Archive Log 삭제
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
Step 5: 데이터베이스 재시작이 필요한 극단적 상황
-- Alert Log에서 상세 오류 확인
SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Diag Trace';
-- 필요 시 RESETLOGS 옵션으로 복구 (최후 수단)
-- 반드시 DBA 권한으로 수행
SHUTDOWN ABORT;
STARTUP MOUNT;
RECOVER DATABASE UNTIL CANCEL;
ALTER DATABASE OPEN RESETLOGS;
예방 방법
1. Redo Log 다중화 및 충분한 그룹/크기 구성
운영 환경에서는 반드시 Redo Log를 최소 2개 이상의 멤버로 다중화하고, 각 멤버는 서로 다른 물리적 디스크에 위치시켜야 합니다. 또한 Log Switch가 너무 빈번하게 발생하면 I/O 부하가 가중되므로, Redo Log 크기를 충분히 크게(운영 환경 기준 최소 500MB~1GB) 설정하고 그룹 수도 최소 3개 이상 유지하는 것이 Best Practice입니다. 아래 쿼리로 주기적으로 Log Switch 빈도를 모니터링하세요.
-- 최근 7일간 Log Switch 빈도 분석
SELECT
TO_CHAR(FIRST_TIME, 'YYYY-MM-DD') AS LOG_DATE,
TO_CHAR(FIRST_TIME, 'HH24') AS LOG_HOUR,
COUNT(*) AS SWITCH_COUNT
FROM V$LOG_HISTORY
WHERE FIRST_TIME >= SYSDATE - 7
GROUP BY
TO_CHAR(FIRST_TIME, 'YYYY-MM-DD'),
TO_CHAR(FIRST_TIME, 'HH24')
ORDER BY 1, 2;
2. 정기적인 디스크 공간 모니터링 및 Alert 설정
Archive Log 대상 디렉토리와 Redo Log 파일 위치의 디스크 사용량을 정기적으로 모니터링하는 스크립트를 구축하고, 임계치(예: 80%) 초과 시 자동 알림이 발송되도록 구성해야 합니다. Oracle Enterprise Manager(OEM) 또는 커스텀 쉘 스크립트를 활용하여 크론잡(Cron Job)으로 스케줄링하고, V$FLASH_RECOVERY_AREA_USAGE 뷰를 통해 FRA 사용량도 함께 관리하는 것을 권장합니다.
-- FRA(Fast Recovery Area) 사용량 모니터링
SELECT
FILE_TYPE,
PERCENT_SPACE_USED,
PERCENT_SPACE_RECLAIMABLE,
NUMBER_OF_FILES
FROM V$FLASH_RECOVERY_AREA_USAGE;
-- DB_RECOVERY_FILE_DEST 설정 확인
SHOW PARAMETER DB_RECOVERY_FILE_DEST;
관련 에러
- ORA-00340: Online Redo Log 관련 I/O 오류 (멤버 읽기/쓰기 실패 공통 상위 에러)
- ORA-00341: Redo Log 멤버 접근 오류 (파일 없음 또는 권한 오류)
- ORA-00342: Archived Log가 필요한 위치에 없을 때 발생
- ORA-00346: Redo Log 멤버가 OFFLINE 상태일 때의 쓰기 오류
- ORA-03113 / ORA-03114: Redo Log 쓰기 실패로 인한 세션 연결 단절
- ORA-00257: Archiver 프로세스가 Archive Log를 기록하지 못해 데이터베이스가 Hang 상태가 될 때 발생하며, ORA-00345와 연쇄적으로 발생하는 경우가 많음
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.