PostgreSQL: could not bind IPv4 address
Сообщение could not bind IPv4 address означает, что PostgreSQL не смог занять адрес и порт. Чаще всего работает другой экземпляр кластера или остался файл сокета от прежнего запуска.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Работает другой кластер на том же порту
На машине может быть несколько версий PostgreSQL. По умолчанию все пытаются занять порт 5432, и второй не запускается.
-
Остался файл сокета или блокировки от прежнего запуска
После аварийного завершения в каталоге сокета остаётся файл postmaster.pid или сам сокет. Новый запуск считает, что сервер уже работает.
-
Адрес из listen_addresses отсутствует на машине
Если в настройках указан конкретный адрес, а он не поднят (например при загрузке), привязка не пройдёт.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Точное сообщение о привязке адреса.
sudo tail -30 /var/log/postgresql/postgresql-16-main.logКто занимает порт базы.
sudo ss -tlnp | grep 5432Все кластеры машины с портами и состоянием.
pg_lsclustersРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- На машине может быть несколько версий PostgreSQL. По умолчанию все пытаются занять порт 5432, и второй не запускается.
- Как проверить
-
Посмотрите кластеры и владельца порта.
pg_lsclusters sudo ss -tlnp | grep 5432
- Как исправить
- Назначьте каждому кластеру свой порт в его файле настроек и перезапустите. Порт видно в выводе pg_lsclusters.
- Почему происходит
- После аварийного завершения в каталоге сокета остаётся файл 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
- Почему происходит
- Если в настройках указан конкретный адрес, а он не поднят (например при загрузке), привязка не пройдёт.
- Как проверить
-
Сравните настройку с адресами машины.
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
Связанные ошибки
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- PostgreSQL: data directory has invalid permissions Кластер PostgreSQL не запускается из-за прав на каталог данных. Требование 0700 или 0750 и как вернуть владельца.
- bind: Permission denied при привязке к порту Отказ при привязке к порту: обычно порт ниже 1024 у службы от непривилегированного пользователя. Как дать возможность CAP_NET_BIND_SERVICE.
- dnsmasq: failed to create listening socket for port 53 Порт 53 занят встроенной службой разрешения имён. Как развести dnsmasq и systemd-resolved.
- Порт занят, но процесса не видно Адрес занят, а инструменты не показывают владельца: другое сетевое пространство имён, контейнер, сокет systemd.
- Apache: could not bind to address Apache не занимает порт: конфликт с nginx, порт занят, нет прав на привилегированный порт.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
Где встречается чаще всего
Источники
- Документация PostgreSQL: настройка соединений
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено двумя кластерами на порту 5432.