PostgreSQL перезапустился после сбоя и восстанавливается
the database system is in recovery mode и terminating connection because of crash of another server process: один процесс PostgreSQL упал, база оборвала все сессии и восстанавливается по журналу.
Что это значит
Один из процессов базы аварийно завершился. PostgreSQL в таком случае обрывает все сессии (terminating connection because of crash of another server process), перечитывает журнал и поднимается заново. Пока идёт восстановление, новым подключениям отвечает the database system is in recovery mode. Обычно это занимает от секунд до нескольких минут.
Самая частая причина на Linux: ядро убило процесс базы из-за нехватки памяти. В логе это строка server process (PID 123) was terminated by signal 9: Killed.
Как проверить
grep -E "terminated by signal|was terminated" $PGDATA/log/*.log | tail
dmesg -T | grep -i -E "out of memory|killed process" | tail
Запись ядра Out of memory: Killed process ... (postgres) подтверждает нехватку памяти. Для контейнера: docker inspect -f '{{.State.OOMKilled}}' <контейнер>.
Что сделать
- Подождать окончания восстановления. Сервисы RX переподключатся сами.
- Найти, кто съел память: слишком большой
work_memпри многих соединениях, тяжёлый запрос, соседний сервис на том же сервере. - Пересчитать настройки памяти. Грубая проверка:
shared_buffersплюсmax_connections×work_memне должны превышать память сервера. - Для сервера только под базу поставить
vm.overcommit_memory = 2, чтобы запрос получал отказ вместо убийства процесса.
Настройки памяти под ваш сервер считает калькулятор PostgreSQL.