Mysql/MySQL 아키텍처 심층 분석

InnoDB Undo/Redo 내부 구조

DEVLIB 2025. 4. 18. 15:53
728x90

InnoDB Undo / Redo 내부 구조 심층 분석

InnoDB는
UndoRedo를 통해 트랜잭션 무결성과 장애 복구를 보장합니다.
둘은 역할이 다르지만 서로 긴밀히 연결되어 있습니다.


1. Undo Log

Undo = 과거로 되돌리는 기록

목적

  • 트랜잭션 롤백 지원
  • MVCC (Multi-Version Concurrency Control) 구현

동작 흐름

1. 데이터 변경 전 상태(Old Version)를 Undo Log에 저장
2. 트랜잭션 실패 시 Undo Log를 이용해 원상 복구
3. 다른 트랜잭션이 읽을 때, Undo Log를 통해 일관된 Snapshot 제공

Undo 내부 구조

구성요소 설명
Undo Segment Undo Record를 묶어 저장하는 논리적 단위
Undo Page 실제 Undo Record를 저장하는 16KB 단위 페이지
History List 완료되지 않은 Undo들을 연결 리스트로 관리

Undo 유형

  • Insert Undo
    • Insert 작업을 롤백하기 위한 Undo
    • 트랜잭션 커밋 후에도 필요 없음 → 빠르게 제거 가능
  • Update Undo
    • Update/Delete 작업을 롤백하거나 MVCC를 위해 필요
    • 커밋 이후에도 오래 남아 있을 수 있음 (Snapshot Isolation을 위해)

Undo 저장 위치

  • Undo는 InnoDB의 Tablespace 안에 저장됨.
  • undo_001, undo_002 등의 Undo Tablespace로 관리 가능
    • MySQL 8.0 이상: Undo가 별도 파일로 분리(innodb_undo_directory, innodb_undo_tablespaces)

2. Redo Log

Redo = 이후 다시 실행하기 위한 기록

목적

  • Crash Recovery 지원 (장애 복구)
  • Durability(D) 보장

동작 흐름

1. 트랜잭션이 변경 작업을 수행
2. Redo Log에 변경 내용(Physical Log) 기록
3. 이후 실제 데이터 페이지(Buffer Pool) 반영
4. 시스템 장애 발생 시 Redo Log로 재적용하여 복구

Redo 내부 구조

구성요소 설명
Redo Log Buffer 메모리에 존재하는 임시 버퍼 (innodb_log_buffer_size)
Redo Log File 디스크에 존재하는 물리 파일 (ib_logfile0, ib_logfile1 등)
LSN (Log Sequence Number) Redo Log의 절대적인 위치 표시
Checkpoint 디스크에 안전하게 기록된 Redo 위치 표시

Redo Log 포맷

  • Physical Log: 데이터 변경된 Page 번호 + Offset + 변경 내용 저장
  • Logical Log가 아님. (예: UPDATE ... 쿼리 문장이 아니라 변경된 바이트 단위 기록)

3. Undo와 Redo 비교

항목  목적 
내용  기록 시점
저장 위치 유지 기간
Undo  롤백 및 MVCC 변경 전 데이터 스냅샷 데이터 변경 직전 Undo Tablespace 오래 남을 수 있음
(MVCC용)
Redo  장애 복구 변경 후 데이터 기록 데이터 변경 직후 Redo Log 파일 (ib_logfile) Checkpoint 이후 불필요

 


4. 장애 복구(Recovery) 시퀀스

시스템 장애 발생 시 InnoDB가 수행하는 복구 과정

복구 단계

  1. Redo Apply (Roll-Forward)
    • 디스크에 아직 반영되지 않은 Redo Log 내용을 데이터 파일에 적용
    • Durability 확보
  2. Undo Apply (Roll-Back)
    • 미완료 트랜잭션(Committed되지 않은)을 Undo Log를 이용해 롤백
    • Atomicity 확보

복구 순서 요약

Redo (재실행) → Undo (롤백)

5. 관련 주요 파라미터

파라미터 설명
innodb_log_file_size 단일 Redo Log 파일 크기
innodb_log_files_in_group Redo 파일 개수 (일반적으로 2)
innodb_log_buffer_size 메모리 상 Redo Log 버퍼 크기
innodb_undo_tablespaces Undo를 저장할 테이블스페이스 수
innodb_undo_log_truncate Undo 자동 압축/삭제 여부 (8.0 이상)

6. 실전 성능 최적화 Tip

항목 전략
Redo Log 크기 트랜잭션 트래픽이 높으면 innodb_log_file_size를 키워야 함 (256MB 이상 권장)
Undo 관리 Long Transaction 발생을 피해서 Undo History List를 짧게 유지
Checkpoint 튜닝 innodb_flush_log_at_trx_commit=2 설정시 성능 향상 (단, 약간의 데이터 손실 위험)
LIST