WAL(Write-Ahead Log)이란? 데이터베이스가 죽어도 살아남는 이유

WAL이란 무엇인가

WAL(Write-Ahead Log)은 ‘쓰기 전에 로그부터 남긴다’는 뜻의 데이터베이스 핵심 기술입니다. 데이터베이스는 실제 데이터 파일을 수정하기 전에, 어떤 변경이 일어날 것인지를 먼저 로그 파일에 기록합니다. 이 로그가 바로 WAL이며, PostgreSQL, MySQL(InnoDB의 redo log), SQLite 등 대부분의 관계형 데이터베이스가 이 방식을 사용합니다.

비유하자면, 이사할 때 짐을 옮기기 전에 ‘어느 방의 어느 짐을 어디로 옮길지’ 목록을 먼저 종이에 적어두는 것과 같습니다. 이사 도중 정전이 나서 작업이 중단되더라도, 종이에 적힌 목록만 있으면 어디까지 옮겼고 무엇이 남았는지 그대로 복구할 수 있습니다.

동작 원리와 예시

일반적인 처리 순서는 다음과 같습니다.

  • 트랜잭션이 데이터를 변경하려고 하면, 변경 내용을 WAL 파일에 순차적으로 기록한다.
  • WAL 기록이 디스크에 안전하게 저장된 후에야 트랜잭션을 ‘커밋 완료’로 처리한다.
  • 실제 데이터 파일(테이블, 인덱스)은 나중에 백그라운드에서 천천히 반영한다.

예를 들어 UPDATE users SET age=30 WHERE id=1;를 실행하면, DB는 실제 테이블을 바로 수정하지 않고 ‘1번 유저의 age를 30으로 바꾼다’는 내용을 WAL에 먼저 씁니다. 만약 이 순간 서버가 갑자기 다운되더라도, 재시작 시 DB는 WAL을 처음부터 다시 읽으며 아직 반영되지 않은 변경사항을 재실행(replay)합니다. 그 결과 데이터는 다운되기 직전 상태로 정확히 복구됩니다.

실무에서 WAL을 쓰는 이유

WAL이 널리 쓰이는 이유는 크게 두 가지입니다. 첫째는 장애 복구(Crash Recovery)입니다. 정전, 프로세스 강제 종료, OS 크래시 등 예기치 못한 상황에서도 커밋된 트랜잭션은 절대 유실되지 않는다는 것을 보장합니다. 이는 ACID 원칙 중 지속성(Durability)을 실현하는 핵심 메커니즘입니다.

둘째는 성능입니다. 데이터 파일은 여러 위치에 흩어져 있어 랜덤 쓰기가 발생하지만, WAL은 항상 파일 끝에 순차적으로 추가되는 구조라 디스크 쓰기 속도가 훨씬 빠릅니다. 또한 WAL은 복제(Replication)에도 활용되어, 마스터의 WAL을 슬레이브가 그대로 받아 적용하면 두 DB가 동일한 상태를 유지할 수 있습니다.

결국 WAL은 ‘먼저 기록하고 나중에 반영한다’는 단순한 원칙만으로 데이터 안정성과 성능이라는 두 마리 토끼를 모두 잡는 영리한 설계라고 할 수 있습니다.

댓글 남기기