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
- Replication slot obsoleto o archiviazione WAL rotta che bloccano
pg_wal. - Semplice crescita dei dati che ha superato il volume.
- File temporanei da sort/hash enormi (una singola query cattiva può scrivere centinaia di GB di temp).
- Log — logging verboso senza rotazione.
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
- Libera prima spazio fuori dalla directory dei dati (vecchi log, pacchetti, file non correlati) così il server può respirare, poi correggi la vera causa.
- Slot obsoleto →
SELECT pg_drop_replication_slot('old_replica');— il WAL viene riciclato entro qualche checkpoint. Archiviazione rotta → correggiarchive_commande guarda il backlog svuotarsi. - Limita le modalità di fallimento per il futuro:
max_slot_wal_keep_size(PostgreSQL 13+) limita quanto WAL uno slot può trattenere;temp_file_limitlimita l'uso di temp fuori controllo delle query; la rotazione dei log per i log. - Ingrandisci il volume quando la causa è onesta crescita dei dati — e aggiungi un alerting sullo spazio disco con abbastanza margine per agire con calma la prossima volta.
