WAL
Jak działa
1. Każda modyfikacja generuje rekord logu (WAL record) opisujący zmianę. 2. Rekordy logu są dopisywane sekwencyjnie do pliku logu i zrzucane na trwały nośnik (fsync) PRZED zmianą właściwych plików danych. 3. Commit transakcji następuje w momencie trwałego zapisania rekordu commit do logu — zmienione strony danych mogą trafić na dysk później. 4. Jeden fsync logu może zatwierdzić wiele małych, współbieżnych transakcji. 5. Checkpoint przenosi zaaplikowane zmiany z logu do właściwych plików danych i pozwala obciąć (lub zarchiwizować) stary log. 6. Po awarii manager odzyskiwania odtwarza zatwierdzone zmiany z logu (REDO), a niezatwierdzone wycofuje (UNDO). WAL umożliwia też kopie zapasowe online i odtwarzanie do punktu w czasie (PITR) przez archiwizację i ponowne odtworzenie logu.
Rozwiązany problem
Jak zagwarantować trwałość i atomowość zatwierdzonych transakcji mimo awarii (crash) bez konieczności kosztownego zrzucania wszystkich zmienionych stron danych na dysk przy każdym commicie. Naiwne podejście (zapis zmian in-place) traci dane przy awarii w trakcie zapisu lub wymusza wiele losowych zapisów na dysk.
Komponenty
Sekwencyjnie dopisywane wpisy opisujące każdą zmianę danych; zrzucane na trwały nośnik przed modyfikacją plików danych.
Operacja przenosząca zaaplikowane zmiany z logu do właściwych plików danych, umożliwiająca obcięcie lub archiwizację starego logu.
Po awarii odtwarza z logu zmiany transakcji zatwierdzonych (REDO) i wycofuje zmiany transakcji niezatwierdzonych (UNDO).
Implementacja
Implementacje oparte na pamięci współdzielonej (np. SQLite) wymagają lokalnego systemu plików; WAL nie działa poprawnie na NFS/sieciowych FS.
Jeśli checkpointy nie przebiegają (np. długo trwający czytelnicy trzymają stary snapshot), log rośnie bez ograniczeń, pochłaniając miejsce i wydłużając odzyskiwanie.
Gwarancje trwałości zakładają, że pamięć masowa rzetelnie realizuje fsync. Skłamane/zbuforowane fsync (np. w tanim sprzęcie lub niektórych FS) mogą prowadzić do utraty zatwierdzonych danych po awarii zasilania.
WAL działa najlepiej dla małych transakcji; dla transakcji rzędu setek MB tryb rollback journal bywa szybszy (dot. SQLite).
Ewolucja
Mohan i in. (IBM) formalizują metodę odzyskiwania opartą na Write-Ahead Logging z drobnoziarnistym blokowaniem i częściowym rollbackiem. Stosowana m.in. w IBM Db2 i Microsoft SQL Server.
SQLite 3.7.0 (2010-07-21) wprowadza tryb WAL jako alternatywę dla rollback journal: większa współbieżność (czytelnicy nie blokują pisarza), bardziej sekwencyjne I/O i mniej wywołań fsync().
Hiperparametry (konfigurowalne osie)
Jak często log jest przenoszony do plików danych. Rzadsze checkpointy = mniej I/O w tle, ale większy log i dłuższe odzyskiwanie.
Czy commit czeka na trwały zrzut logu. Synchroniczny commit daje pełną trwałość kosztem opóźnienia; asynchroniczny zwiększa przepustowość ryzykiem utraty ostatnich transakcji.
Maksymalny rozmiar logu wyzwalający checkpoint/obcięcie. Zapobiega nadmiernemu wzrostowi pliku WAL.
Równoległość
Log jest dopisywany sekwencyjnie, co nadaje zapisom charakter sekwencyjny (tani fsync), ale serializuje strumień logu. Jeden fsync logu może jednak zatwierdzić wiele współbieżnych transakcji (group commit).
Wymagania sprzętowe
WAL to technika programowa niezależna od akceleratorów; korzysta głównie z szybkiego, sekwencyjnego zapisu na trwałym nośniku (SSD/NVMe) i wydajnego fsync.