WAL이란 무엇인가
WAL(Write-Ahead Logging)은 데이터베이스가 실제 데이터를 디스크에 저장하기 전에, 어떤 변경이 일어날지를 먼저 로그 파일에 기록해두는 기법입니다. 이름 그대로 ‘쓰기 작업에 앞서(Write-Ahead) 로그를 남긴다’는 뜻입니다. PostgreSQL, MySQL의 InnoDB, SQLite 등 대부분의 관계형 데이터베이스가 이 방식을 채택하고 있습니다.
동작 원리: 은행 거래 명세서에 비유하면
WAL의 동작을 은행 창구 업무에 비유해보겠습니다. 은행 직원이 계좌 간 돈을 이동시킬 때, 먼저 전산 시스템의 원장(로그)에 ‘얼마를 어디서 어디로 옮긴다’는 기록을 남긴 뒤, 실제 계좌 잔액을 변경합니다. 작업 중 정전이 나더라도, 나중에 원장을 다시 확인해 ‘이 거래는 기록됐지만 반영이 안 됐구나’를 판단하고 복구할 수 있습니다.
데이터베이스도 마찬가지로 트랜잭션이 발생하면 다음 순서로 처리됩니다.
- 변경 내용을 WAL 로그 파일에 순차적으로 기록(append)
- 로그가 디스크에 안전하게 저장된 것을 확인(fsync)
- 커밋 완료 응답을 클라이언트에 전달
- 실제 데이터 파일(테이블 페이지)은 이후 여유가 있을 때 반영
즉, 실제 데이터 파일 갱신은 뒤로 미뤄지더라도 로그만 안전하게 남아 있으면 장애 발생 시 로그를 재생(replay)해 데이터를 원래 상태로 복구할 수 있습니다. 이 과정을 ‘리커버리(recovery)’라고 부릅니다.
실무에서 WAL을 쓰는 이유
WAL을 사용하는 가장 큰 이유는 성능과 안정성을 동시에 확보할 수 있기 때문입니다. 데이터 파일은 여기저기 흩어진 페이지를 랜덤하게 읽고 써야 해서 느리지만, 로그는 항상 파일 끝에 순차적으로 추가(append-only)되기 때문에 디스크 입출력이 훨씬 빠릅니다. 트랜잭션마다 전체 데이터 페이지를 디스크에 반영하는 대신, 가벼운 로그 기록만으로 커밋을 완료할 수 있는 것입니다.
또한 WAL은 장애 복구뿐 아니라 복제(Replication) 기능의 기반이 되기도 합니다. PostgreSQL의 스트리밍 복제는 마스터가 생성한 WAL 로그를 슬레이브에 그대로 전달해 동일한 상태를 재현하는 방식으로 동작합니다. 결국 WAL은 ‘먼저 기록하고 나중에 반영한다’는 단순한 원칙 하나로 데이터 무결성, 빠른 쓰기 성능, 복제까지 모두 지원하는 핵심 인프라인 셈입니다.