Errore PostgreSQL: No space left on device

ERROR:  could not extend file "base/16384/51829": No space left on device
HINT:  Check free disk space.

Il filesystem che ospita il database non ha più spazio. Le scritture iniziano a fallire; se il WAL stesso non può essere scritto, il server va in PANIC e si spegne. Una regola prima di tutto il resto: non cancellare mai manualmente i file dentro la directory dei dati — specialmente pg_wal. Quella strada porta da un disservizio a un restore.

Cosa significa questo errore

Il disco pieno su un host PostgreSQL ha una breve lista di soliti sospetti, e il più istruttivo è la ritenzione del WAL: pg_wal si auto-pulisce nel funzionamento normale, quindi quando cresce senza limiti, qualcosa sta dicendo a PostgreSQL di tenere il WAL. Le due ragioni classiche: un archive_command che fallisce (il WAL non può essere riciclato finché non è archiviato) e un replication slot inattivo — un replica dismesso senza eliminare il suo slot tiene il WAL bloccato per sempre.

Cause comuni

Come diagnosticarlo

# Dove sono finiti i GB:
df -h
du -sh /var/lib/postgresql/*/main/*   # base/ pg_wal/ log/ ...
-- Slot che trattengono WAL (guarda active=f e quanto trattengono):
SELECT slot_name, active,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS retained_wal
FROM pg_replication_slots;

-- Query che scrivono troppi file temporanei (abilita log_temp_files per la storia):
SELECT datname, temp_files, pg_size_pretty(temp_bytes) FROM pg_stat_database;

Come risolverlo

🔍 Lettura correlata: VACUUM & bloat — il bloat gonfia tabelle e indici ben oltre la dimensione dei loro dati vivi.