Error de PostgreSQL: No space left on device
ERROR: could not extend file "base/16384/51829": No space left on device
HINT: Check free disk space.
El sistema de archivos que aloja la base de datos no tiene espacio. Las escrituras empiezan a fallar; si el propio WAL no puede escribirse, el servidor hará PANIC y se apagará. Una regla antes que nada: nunca borres manualmente archivos dentro del directorio de datos — especialmente pg_wal. Ese camino lleva de una caída a una restauración.
Qué significa este error
El disco lleno en un host de PostgreSQL tiene una lista corta de sospechosos habituales, y el más instructivo es la retención de WAL: pg_wal se limpia solo en operación normal, así que cuando crece sin límite, algo le está diciendo a PostgreSQL que conserve el WAL. Las dos razones clásicas: un archive_command que falla (el WAL no puede reciclarse hasta que se archive) y un slot de replicación inactivo — una réplica que fue dada de baja sin eliminar su slot mantiene el WAL fijado para siempre.
Causas comunes
- Slot de replicación obsoleto o archivado de WAL roto fijando
pg_wal. - Crecimiento de datos normal que superó el volumen.
- Archivos temporales de sorts/hashes enormes (una sola consulta mala puede escribir cientos de GB de temp).
- Logs — logging verboso sin rotación.
Cómo diagnosticarlo
# Dónde han ido a parar los GB:
df -h
du -sh /var/lib/postgresql/*/main/* # base/ pg_wal/ log/ ...
-- Slots que retienen WAL (mira active=f y cuánto retienen):
SELECT slot_name, active,
pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS retained_wal
FROM pg_replication_slots;
-- Consultas que escriben demasiados archivos temporales (habilita log_temp_files para el historial):
SELECT datname, temp_files, pg_size_pretty(temp_bytes) FROM pg_stat_database;
Cómo solucionarlo
- Libera espacio fuera del directorio de datos primero (logs viejos, paquetes, archivos no relacionados) para que el servidor pueda respirar, y luego arregla la causa real.
- Slot obsoleto →
SELECT pg_drop_replication_slot('old_replica');— el WAL se recicla en unos pocos checkpoints. Archivado roto → arreglaarchive_commandy observa cómo se drena el backlog. - Acota los modos de fallo para el futuro:
max_slot_wal_keep_size(PostgreSQL 13+) limita cuánto WAL puede retener un slot;temp_file_limitlimita el uso descontrolado de temp por consulta; rotación de logs para los logs. - Amplía el volumen cuando la causa sea un crecimiento de datos honesto — y añade alertas de espacio en disco con margen suficiente para actuar con calma la próxima vez.
