로그 선행 기입

로그 선행 기입(Log-ahead logging 또는 Write-ahead logging, WAL)은 데이터베이스 관리 시스템(DBMS) 및 파일 시스템에서 데이터의 무결성(Integrity)과 지속성(Durability)을 보장하기 위해 사용되는 핵심 기법입니다. 트랜잭션이 데이터 변경을 가하기 전에, 해당 변경 사항을 기술하는 로그(Log) 레코드를 먼저 안정적인 저장소(예: 디스크)에 기록하는 것을 의미합니다.

개요

로그 선행 기입의 핵심 원칙은 "데이터를 변경하기 전에 변경 내용을 설명하는 로그를 먼저 기록하라"입니다. 이는 데이터베이스 시스템이 트랜잭션을 실행하는 동안 시스템 장애(예: 전원 공급 중단, 소프트웨어 충돌)가 발생하더라도 데이터의 일관성(Consistency)과 영속성(Durability)을 유지할 수 있도록 합니다. WAL은 데이터베이스 시스템의 ACID 속성 중 영속성(Durability)과 원자성(Atomicity)을 구현하는 데 필수적인 메커니즘입니다.

작동 방식

  1. 로그 레코드 생성: 트랜잭션이 데이터에 대한 수정(삽입, 삭제, 갱신)을 시도할 때, 수정 전의 값(UNDO 정보)과 수정 후의 값(REDO 정보)을 포함하는 로그 레코드를 생성합니다. 이 로그 레코드에는 어떤 트랜잭션이, 언제, 어떤 데이터 블록의 어떤 내용을 어떻게 변경했는지에 대한 상세 정보가 포함됩니다.
  2. 로그 선행 기록: 생성된 로그 레코드를 실제 데이터 블록에 변경 사항을 적용하기 전에 먼저 비휘발성 저장 장치(일반적으로 디스크의 로그 파일)에 기록하고, 기록이 완료되었음을 확인합니다. 이는 메모리(버퍼 풀)에 있는 더티 페이지(Dirty Page)가 디스크에 기록되는 시점과 독립적입니다.
  3. 데이터 변경 적용: 로그 기록이 성공적으로 완료된 후에야 실제 데이터 블록에 변경 사항을 적용합니다. 이 변경된 데이터 블록은 메모리에 잠시 머물다가 나중에 디스크로 플러시(Flush)될 수 있습니다.
  4. 트랜잭션 커밋: 트랜잭션이 성공적으로 완료되면, 해당 트랜잭션의 커밋(Commit) 로그 레코드가 기록됩니다. 이 커밋 레코드는 해당 트랜잭션이 영구적으로 완료되었음을 나타냅니다.

장점

  • 내구성(Durability) 보장: 시스템 충돌 발생 시, 디스크에 기록된 로그를 사용하여 커밋된 트랜잭션의 모든 변경 사항을 복구(REDO)할 수 있습니다. 충돌 이전까지 디스크에 기록되지 못했던 변경 사항도 로그를 통해 복원됩니다.
  • 원자성(Atomicity) 보장: 트랜잭션 도중 시스템 충돌이 발생하면, 로그에 기록된 UNDO 정보를 사용하여 부분적으로 완료된 트랜잭션의 변경 사항을 되돌려(UNDO) 데이터 일관성을 유지할 수 있습니다.
  • 성능 향상: 디스크의 무작위 쓰기(Random Write)를 순차 쓰기(Sequential Write)로 변환하여 I/O 성능을 향상시킬 수 있습니다. 로그 파일은 대개 순차적으로 기록되기 때문에, 무작위적인 데이터 블록 쓰기보다 훨씬 빠릅니다. 이는 I/O 병목 현상을 줄이는 데 기여합니다.
  • 동시성 제어 지원: 트랜잭션 복구에 필요한 정보를 제공하여 복잡한 동시성 제어 기법(예: 잠금, 다중 버전 동시성 제어)과 결합될 수 있습니다.

적용 분야

  • 관계형 데이터베이스 관리 시스템(RDBMS): Oracle, MySQL(InnoDB 스토리지 엔진), PostgreSQL, SQL Server 등 대부분의 상용 및 오픈소스 데이터베이스에서 트랜잭션 로깅 및 복구의 핵심 메커니즘으로 사용됩니다.
  • 파일 시스템: 저널링 파일 시스템(Journaling File System)에서 메타데이터의 일관성을 유지하고 복구하는 데 유사한 원리(저널링)가 적용됩니다. 대표적인 예로는 ext3/4, NTFS 등이 있습니다.
  • 분산 시스템 및 메시지 큐: 데이터의 안정적인 전송 및 처리를 보장하기 위한 메커니즘으로 활용될 수 있습니다.

관련 개념

  • ACID 속성: WAL은 특히 D(Durability, 영속성)와 A(Atomicity, 원자성)를 보장하는 데 기여합니다.
  • 체크포인트(Checkpoint): 로그 파일의 크기가 너무 커지는 것을 방지하고 복구 시간을 단축하기 위해 주기적으로 데이터베이스의 현재 상태를 디스크에 동기화하는 작업입니다.
  • 저널링 파일 시스템(Journaling File System): 파일 시스템의 메타데이터 변경을 디스크에 기록하기 전에 저널(로그)에 먼저 기록하여 파일 시스템의 일관성을 유지합니다.
둘러보기

더 찾아볼 만한 주제