SystemdDoctor
служба не работает postgresql диск

PostgreSQL: нет места под журнал предзаписи

Журнал предзаписи растёт, когда его некому освободить: не работает архивация, отстала репликация, или слот репликации держит старые файлы. При заполнении раздела база останавливается, чтобы не потерять данные.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Неработающая архивация журнала

    При включённой архивации база не удаляет файлы, пока они не заархивированы. Сломанная команда архивации приводит к бесконечному росту.

  2. Слот репликации держит старые файлы

    Неиспользуемый слот заставляет базу хранить журнал «для будущего подписчика», которого нет.

  3. Раздел мал для нагрузки записи

    При интенсивной записи объём журнала между контрольными точками может превышать свободное место.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Размер каталога журнала предзаписи.

sudo du -sh /var/lib/postgresql/*/main/pg_wal 2>/dev/null

Слоты репликации, которые могут держать файлы.

sudo -u postgres psql -c 'SELECT * FROM pg_replication_slots;' 2>/dev/null

Свободное место на разделе базы.

df -h /var/lib/postgresql

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Неработающая архивация журнала
Почему происходит
При включённой архивации база не удаляет файлы, пока они не заархивированы. Сломанная команда архивации приводит к бесконечному росту.
Как проверить
Посмотрите состояние архивации.
sudo -u postgres psql -c 'SELECT * FROM pg_stat_archiver;' 2>/dev/null
Как исправить
Исправьте команду архивации. Пока она не работает, каталог будет расти — это задача срочная.
2. Слот репликации держит старые файлы
Почему происходит
Неиспользуемый слот заставляет базу хранить журнал «для будущего подписчика», которого нет.
Как проверить
Посмотрите слоты и их отставание.
sudo -u postgres psql -c 'SELECT slot_name, active, restart_lsn FROM pg_replication_slots;' 2>/dev/null
Как исправить
Удалите ненужные слоты. Для действующих настройте ограничение через max_slot_wal_keep_size.
3. Раздел мал для нагрузки записи
Почему происходит
При интенсивной записи объём журнала между контрольными точками может превышать свободное место.
Как проверить
Посмотрите размер каталога журнала и место.
sudo du -sh /var/lib/postgresql/16/main/pg_wal
df -h /var/lib/postgresql
Как исправить
Увеличьте раздел или настройте параметры контрольных точек так, чтобы журнал освобождался чаще.

Пример вывода

Раздел с журналом предзаписи заполнен. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

postgres[5200]: PANIC:  could not write to file "pg_wal/xlogtemp.5200": No space left on device
postgres[5200]: LOG:  database system is shut down
systemd[1]: postgresql@16-main.service: Main process exited, code=exited, status=1/FAILURE

Связанные ошибки

Где встречается чаще всего

Источники

  • Документация PostgreSQL: журнал предзаписи документация программы
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено заполнением раздела при активной записи.
    собственная проверка, systemd 255
    сверено 15 сентября 2026