PostgreSQL: нет места под журнал предзаписи
Журнал предзаписи растёт, когда его некому освободить: не работает архивация, отстала репликация, или слот репликации держит старые файлы. При заполнении раздела база останавливается, чтобы не потерять данные.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Неработающая архивация журнала
При включённой архивации база не удаляет файлы, пока они не заархивированы. Сломанная команда архивации приводит к бесконечному росту.
-
Слот репликации держит старые файлы
Неиспользуемый слот заставляет базу хранить журнал «для будущего подписчика», которого нет.
-
Раздел мал для нагрузки записи
При интенсивной записи объём журнала между контрольными точками может превышать свободное место.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Размер каталога журнала предзаписи.
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Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- При включённой архивации база не удаляет файлы, пока они не заархивированы. Сломанная команда архивации приводит к бесконечному росту.
- Как проверить
-
Посмотрите состояние архивации.
sudo -u postgres psql -c 'SELECT * FROM pg_stat_archiver;' 2>/dev/null
- Как исправить
- Исправьте команду архивации. Пока она не работает, каталог будет расти — это задача срочная.
- Почему происходит
- Неиспользуемый слот заставляет базу хранить журнал «для будущего подписчика», которого нет.
- Как проверить
-
Посмотрите слоты и их отставание.
sudo -u postgres psql -c 'SELECT slot_name, active, restart_lsn FROM pg_replication_slots;' 2>/dev/null
- Как исправить
-
Удалите ненужные слоты. Для действующих настройте ограничение через
max_slot_wal_keep_size.
- Почему происходит
- При интенсивной записи объём журнала между контрольными точками может превышать свободное место.
- Как проверить
-
Посмотрите размер каталога журнала и место.
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
Связанные ошибки
- No space left on device в журнале службы Нет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- PostgreSQL: долгий запуск и таймаут восстановления Кластер восстанавливается после аварийного завершения дольше таймаута systemd. Как правильно увеличить TimeoutStartSec.
- Disk quota exceeded для службы Место на разделе есть, а запись отклоняется: исчерпана дисковая квота пользователя или группы.
- Docker: no space left on device при запуске контейнеров Раздел с /var/lib/docker заполнен образами и слоями. Как посчитать занятое и что можно удалить безопасно.
- Elasticsearch: индексы переведены в режим только для чтения Elasticsearch блокирует запись при нехватке места: пороги watermark. Как снять блокировку правильно.
- Input/output error в журнале службы Ошибка ввода-вывода: проблемы носителя, отвалившийся сетевой ресурс, повреждённая файловая система. Что проверять срочно.
- MySQL: InnoDB не запускается после аварийного завершения Ошибки InnoDB при старте: повреждение страниц, несовпадение журнала, режим принудительного восстановления.
- MySQL: журнал двоичных изменений заполнил диск Место кончилось из-за binlog: не настроена очистка, отстала репликация, слишком большой срок хранения.
Где встречается чаще всего
Источники
- Документация PostgreSQL: журнал предзаписи
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено заполнением раздела при активной записи.