SystemdDoctor
служба не работает postgresql сеть порты

PostgreSQL: could not bind IPv4 address

Сообщение could not bind IPv4 address означает, что PostgreSQL не смог занять адрес и порт. Чаще всего работает другой экземпляр кластера или остался файл сокета от прежнего запуска.

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

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

  1. Работает другой кластер на том же порту

    На машине может быть несколько версий PostgreSQL. По умолчанию все пытаются занять порт 5432, и второй не запускается.

  2. Остался файл сокета или блокировки от прежнего запуска

    После аварийного завершения в каталоге сокета остаётся файл postmaster.pid или сам сокет. Новый запуск считает, что сервер уже работает.

  3. Адрес из listen_addresses отсутствует на машине

    Если в настройках указан конкретный адрес, а он не поднят (например при загрузке), привязка не пройдёт.

Диагностика

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

Точное сообщение о привязке адреса.

sudo tail -30 /var/log/postgresql/postgresql-16-main.log

Кто занимает порт базы.

sudo ss -tlnp | grep 5432

Все кластеры машины с портами и состоянием.

pg_lsclusters

Решение

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

1. Работает другой кластер на том же порту
Почему происходит
На машине может быть несколько версий PostgreSQL. По умолчанию все пытаются занять порт 5432, и второй не запускается.
Как проверить
Посмотрите кластеры и владельца порта.
pg_lsclusters
sudo ss -tlnp | grep 5432
Как исправить
Назначьте каждому кластеру свой порт в его файле настроек и перезапустите. Порт видно в выводе pg_lsclusters.
2. Остался файл сокета или блокировки от прежнего запуска
Почему происходит
После аварийного завершения в каталоге сокета остаётся файл postmaster.pid или сам сокет. Новый запуск считает, что сервер уже работает.
Как проверить
Посмотрите файлы блокировки и сокета.
sudo ls -l /var/lib/postgresql/16/main/postmaster.pid /var/run/postgresql/ 2>/dev/null
Как исправить
Убедитесь, что процессов postgres нет, и удалите файл блокировки. Удалять его при работающем сервере нельзя: это приведёт к повреждению данных.
ps -u postgres -o pid,cmd | grep -v grep
sudo rm /var/lib/postgresql/16/main/postmaster.pid
3. Адрес из listen_addresses отсутствует на машине
Почему происходит
Если в настройках указан конкретный адрес, а он не поднят (например при загрузке), привязка не пройдёт.
Как проверить
Сравните настройку с адресами машины.
sudo grep -E "^listen_addresses|^port" /etc/postgresql/16/main/postgresql.conf
ip -brief addr
Как исправить
Слушайте на всех интерфейсах или дождитесь готовности сети зависимостью unit-файла.

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

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

postgres[5120]: LOG:  could not bind IPv4 address "0.0.0.0": Address already in use
postgres[5120]: HINT:  Is another postmaster already running on port 5432?
postgres[5120]: WARNING:  could not create listen socket for "*"
postgres[5120]: FATAL:  could not create any TCP/IP sockets

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

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

Источники

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