29.2. Write-Ahead 로깅(WAL)

Write-Ahead 로깅 (WAL)은 데이터 무결성을 보장하는 표준 방법이다. 자세한 설명은 트랜잭션 프로세싱에 대한 대부분의 책자에 나와 있다(전부는 아니지만). 짧게 말해서, WAL의 중심 개념은 변경을 로깅한 후에만, 즉 변경 내용을 설명하는 로그 레코드를 영구적 저장소에 먼저 기록한 후에 데이터 파일(테이블과 인덱스가 있는)의 변경 내용을 작성해야 한다는 것이다. 이 절차를 준수한 경우 충돌 발생 시 로그를 사용하여 데이터베이스를 복수할 수 있으므로 트랜잭션 커밋마다 데이터 페이지를 디스크에 쓸 필요가 없다. 데이터 페이지에 적용되지 않은 변경 내용은 로그 레코드에서 실행 취소가 가능하다. (이것은 롤포워드roll-forward 복구이며, REDO라고도 한다.)

작은 정보

WAL은 충돌 후 데이터베이스 파일 내용을 복구하므로 데이터 파일 또는 WAL 파일의 안정적인 저장소의 경우 저널링된 파일 시스템은 불필요하다. 사실, 저널링 오버헤드는 특히 저널링이 파일 시스템 데이터를 디스크에 쓰게 하는 경우, 성능에 역효과가 난다. 다행히도 저널링 중 데이터 쓰기는 파일 시스템 마운트 옵션(예: Linux ext3 파일 시스템의 경우 data=writeback)을 사용하여 빈번하게 비활성화된다.

트랜잭션에 의해 변경된 모든 데이터 파일보다는 트랜잭션이 커밋된 것을 보장하기 위해 로그 파일만 디스크에 써야 하기 때문에 WAL을 사용하면 디스크 쓰기 수가 상당히 줄어든다. 로그 파일은 순차적으로 작성되며, 따라서 로그 파일 동기화 비용은 데이터 페이지 쓰기 비용보다 훨씬 적다. 이것은 특히 서버가 데이터 스토어의 서로 다른 부분을 건드리는 소규모 트랜잭션을 다수 처리하는 경우에 그렇다. 또한, 서버가 소규모 동시 트랜잭션을 다수 처리하는 경우에 로그 파일의 fsync 하나로 여러 가지 트랜잭션을 충분히 커밋할 수 있다.

WAL은 또한 25.3절에 설명된 대로 온라인 백업 및 PIT(point-in-time) 복구를 지원을 가능하게 한다. WAL 데이터를 아카이빙함으로써, 가용한 WAL 데이터가 즉각 커버하는 시점으로 복귀를 지원할 수 있다. 간단히 데이터베이스의 실제 백업을 설치하고 원하는 시간만큼 WAL 로그를 리플레이하면 된다. 무엇보다, 실제 백업은 데이터베이스 상태의 즉각적인 스냅샷일 필요는 없다. 이것이 일정 기간에 걸쳐 이루어진 경우 해당 기간에 대한 WAL 로그를 리플레이하면 내부 불일치가 해결된다.