Не работает архивирование журнала PostgreSQL
archive command failed with exit code в логе PostgreSQL: сегменты WAL не уходят в архив, точка восстановления не двигается, каталог pg_wal растёт. Как найти причину.
Что это значит
PostgreSQL вызывает команду из archive_command для каждого заполненного сегмента журнала. Команда вернула ошибку, сегмент остался в pg_wal, и база будет повторять попытку. Пока архив не заработает, сегменты копятся и точка, до которой можно восстановиться, стоит на месте.
Частые причины: в каталоге архива кончилось место, нет прав у пользователя postgres, недоступен сетевой ресурс, в архиве уже лежит файл с таким именем.
Как проверить
Следующая строка лога показывает саму команду: DETAIL: The failed archive command was: .... Выполните её руками под пользователем postgres, подставив имя сегмента, и посмотрите текст ошибки.
select archived_count, failed_count, last_archived_time, last_failed_time, last_failed_wal from pg_stat_archiver;
last_failed_time позже last_archived_time означает, что архив стоит прямо сейчас.
Что сделать
- Устранить причину: место, права, доступность хранилища.
- Дождаться, пока очередь разойдётся:
failed_countперестанет расти,last_archived_timeначнёт обновляться. - Проверить размер
pg_wal: после восстановления архива он уменьшится сам. - Поставить наблюдение за
pg_stat_archiver. Утилита rxdoctor проверяет это пунктом PG-12.