Главная / Справочник ошибок / PostgreSQL
На диске базы кончилось место, PostgreSQL остановился
PANIC: could not write to file "pg_wal/xlogtemp.123": No space left on device
PANIC could not write to file pg_wal, No space left on device: каталог журнала PostgreSQL заполнил диск и база остановилась. Почему растёт pg_wal и как безопасно освободить место.
Что это значит
PostgreSQL не смог записать журнал предзаписи (WAL) и остановился с PANIC. Это защита от порчи данных. Пока место не появится, база не запустится.
Каталог pg_wal растёт без ограничения в трёх случаях. Не работает архивирование: archive_command падает, и сегменты ждут отправки. Есть слот репликации, потребитель которого выключен. Идёт очень долгая транзакция. Реже место съедают сами данные или журналы сервера на том же томе.
Как проверить
df -h /путь/к/данным
du -sh $PGDATA/pg_wal $PGDATA/log
Если база ещё работает:
select slot_name, active, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) from pg_replication_slots;
select archived_count, failed_count, last_failed_time from pg_stat_archiver;
Что сделать
- Не удалять файлы из
pg_walруками. Это ломает базу и реплики. - Освободить место рядом: старые журналы сервера в
$PGDATA/log, чужие файлы на том же томе. Или расширить том. - Запустить базу и убрать причину: починить
archive_command, удалить слот без потребителя черезpg_drop_replication_slot. - После этого PostgreSQL сам удалит лишние сегменты на ближайшем чекпоинте.
- На будущее ограничить слоты параметром
max_slot_wal_keep_sizeи следить за свободным местом.
Подробно: Каталог pg_wal растёт, диск кончается, база встаёт.