Mysql/MySQL 아키텍처 심층 분석
InnoDB Undo/Redo 내부 구조
DEVLIB
2025. 4. 18. 15:53
728x90
InnoDB Undo / Redo 내부 구조 심층 분석
InnoDB는
Undo와 Redo를 통해 트랜잭션 무결성과 장애 복구를 보장합니다.
둘은 역할이 다르지만 서로 긴밀히 연결되어 있습니다.
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가 수행하는 복구 과정
복구 단계
- Redo Apply (Roll-Forward)
- 디스크에 아직 반영되지 않은 Redo Log 내용을 데이터 파일에 적용
- → Durability 확보
- 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