1. Glossario/

WAL

Write-Ahead Log

Il WAL (Write-Ahead Log) è il registro sequenziale di tutte le modifiche apportate al database PostgreSQL: ogni INSERT, UPDATE, DELETE, DDL viene scritto qui prima che le modifiche vengano applicate ai file dati veri e propri. È il fondamento di durability, crash recovery, replica fisica e replica logica.

Perché è “Write-Ahead” #

La regola è: la transazione è considerata committed solo quando il record WAL corrispondente è stato fsync-ato su disco. Anche se il server crasha subito dopo, il file dati può essere ricostruito riproducendo i record WAL dall’ultimo checkpoint. Questa garanzia permette a PostgreSQL di tollerare crash improvvisi senza corruzione del database.

Struttura su disco #

I record WAL sono raggruppati in segmenti da 16 MB di default (configurabile via wal_segment_size) nella directory pg_wal/. Ogni segmento ha un nome esadecimale a 24 caratteri (es. 000000010000000000000042) che codifica timeline + offset LSN — il Log Sequence Number, l’identificatore monotonico di posizione nel WAL.

Replica logica e WAL #

La replica logica di PostgreSQL decodifica i record WAL (originariamente in formato fisico) in cambi logici riga per riga (INSERT/UPDATE/DELETE con valori di colonna) tramite il plugin pgoutput. È questo passaggio di “logical decoding” che permette ai subscriber di applicare le modifiche su tabelle anche con layout fisico diverso (es. PostgreSQL 13 → 15 con tablespace cambiato). Senza WAL non c’è replica.