Ошибка “could not connect to server: No such file or directory” или “could not connect to server: Connection refused” при попытке подключиться к PostgreSQL через сокет /var/run/postgresql/.s. PGSQL.5432 означает, что psql (клиент PostgreSQL) не может найти или установить соединение с сервером PostgreSQL по указанному Unix-сокету. Эта ошибка возникает, когда сервер PostgreSQL либо не запущен, либо не настроен для прослушивания соединений через сокет, либо настроен на другой сокет, либо у пользователя, пытающегося подключиться, нет прав для доступа к сокету.
Наиболее распространенные причины и способы их решения:
Сервер PostgreSQL не запущен:
Проверка: Убедитесь, что сервер PostgreSQL запущен. Способ проверки зависит от вашей операционной системы и способа установки PostgreSQL.
Linux (systemd): sudo systemctl status postgresql или sudo systemctl status postgresql. service
Linux (SysVinit): sudo service postgresql status или sudo /etc/init. d/postgresql status
Windows: Проверьте, запущена ли служба PostgreSQL в “Службах” (Services. msc).
Решение: Если сервер не запущен, запустите его.
Linux (systemd): sudo systemctl start postgresql или sudo systemctl start postgresql. service
Linux (SysVinit): sudo service postgresql start или sudo /etc/init. d/postgresql start
Windows: Запустите службу PostgreSQL в “Службах”.
Сервер PostgreSQL не настроен для прослушивания сокетов:
Проверка: Убедитесь, что PostgreSQL настроен для прослушивания соединений через Unix-сокет. Для этого нужно проверить файл postgresql. conf.
Найдите файл postgresql. conf. Обычно он находится в каталоге данных PostgreSQL. Расположение каталога данных можно узнать, выполнив команду pg_config —sharedir (в Linux) или посмотрев настройки службы PostgreSQL в Windows.
Откройте postgresql. conf в текстовом редакторе.
Найдите параметр listen_addresses. Если он закомментирован (#listen_addresses = ‘localhost’) или имеет значение ‘localhost’, раскомментируйте его и установите значение ‘*’:
Listen_addresses = ‘*’
ИЛИ (если хотите разрешить только локальные соединения через сокет):
Listen_addresses = » # пустая строка означает только Unix-сокеты
Найдите параметр unix_socket_directories. Убедитесь, что он установлен в правильное значение (‘/var/run/postgresql’):
Unix_socket_directories = ‘/var/run/postgresql’
Решение: Измените postgresql. conf как описано выше и перезапустите сервер PostgreSQL.
Перезапуск: sudo systemctl restart postgresql (Linux) или перезапустите службу в Windows.
Неправильный сокет, используемый psql:
Проверка: Убедитесь, что psql пытается подключиться к правильному сокету. Параметр -h в команде psql указывает хост, но при использовании Unix-сокетов это значение игнорируется, если указан параметр -U (username) и не указан параметр -H (explicit socket directory).
Решение:
Укажите пользователя: Убедитесь, что вы указываете имя пользователя с помощью параметра -U.
Psql — U <имя_пользователя> — d <имя_базы_данных>
Укажите сокет явно (если нужно): Если вы подозреваете, что сервер использует другой сокет (например, при нестандартной установке), можно указать его явно:
Psql — h localhost — U <имя_пользователя> -d <имя_базы_данных>
Или (более явно):
Psql — h /var/run/postgresql -U <имя_пользователя> — d <имя_базы_данных>
Или (иногда помогает, если у системы проблемы с разрешением имени хоста):
Psql — h 127.0.0.1 — U <имя_пользователя> — d <имя_базы_данных>
Недостаточно прав доступа к сокету:
Проверка: Убедитесь, что у пользователя, под которым вы запускаете psql, есть права на чтение и запись в каталог /var/run/postgresql.
Решение:
Проверьте права: ls — l /var/run/postgresql (Linux). Убедитесь, что пользователь, под которым вы запускаете psql, входит в группу, которой принадлежит сокет, или имеет другие необходимые права.
Измените права (осторожно!): Не рекомендуется, но если это необходимо, вы можете изменить права доступа к сокету (например, добавив пользователя в группу, которой принадлежит сокет). Однако, это может быть небезопасно и нарушить безопасность системы. Используйте эту опцию только если вы понимаете последствия.
Запускайте psql от имени пользователя postgres: sudo — u postgres psql — d <имя_базы_данных> (Linux). Этот способ гарантирует, что psql будет запущен с правами, необходимыми для доступа к сокету.
Проблемы с файловой системой (редко):
В очень редких случаях, проблемы с файловой системой, на которой находится каталог /var/run/postgresql, могут препятствовать созданию или доступу к сокету.
Решение: Проверьте файловую систему на наличие ошибок (например, с помощью fsck в Linux).
SELinux или AppArmor блокируют доступ (редко):
Если у вас включены SELinux или AppArmor, они могут блокировать доступ psql к сокету.
Решение: Проверьте логи SELinux или AppArmor на предмет сообщений об отказе в доступе и настройте политики безопасности, чтобы разрешить доступ psql к сокету. (Это требует продвинутых знаний о SELinux или AppArmor).
Пошаговая инструкция по устранению проблемы (Linux):
Проверьте статус сервера PostgreSQL:
Sudo systemctl status postgresql
Если он не запущен, запустите его:
Sudo systemctl start postgresql
Проверьте файл Postgresql. conf:
Sudo nano /etc/postgresql/<версия> /main/postgresql. conf # Замените <версия> на версию PostgreSQL
Убедитесь, что listen_addresses = ‘*’ или listen_addresses = » и unix_socket_directories = ‘/var/run/postgresql’. Сохраните изменения и закройте редактор.
Перезапустите сервер PostgreSQL:
Sudo systemctl restart postgresql
Попробуйте подключиться, указав имя пользователя и базу данных:
Psql — U postgres — d postgres # Замените postgres на имя вашего пользователя и базы данных
Или попробуйте:
Sudo — u postgres psql — d postgres
Если все еще не работает, проверьте права доступа к сокету:
Ls — l /var/run/postgresql
Убедитесь, что пользователь, под которым вы запускаете psql, имеет права на доступ к сокету.
Проверьте логи PostgreSQL на наличие ошибок (обычно находятся в /var/log/postgresql/).
Важно: Замените <имя_пользователя> и <имя_базы_данных> на соответствующие значения для вашей системы. Замените <версия> на версию PostgreSQL, установленную в вашей системе (например, 12, 13, 14). Конкретные команды и пути могут немного отличаться в зависимости от вашей операционной системы и дистрибутива Linux.
Следуя этим шагам, вы сможете диагностировать и устранить ошибку “could not connect to server” при подключении к PostgreSQL через Unix-сокет. Если проблема не решается, предоставьте больше информации о вашей операционной системе, версии PostgreSQL и способе установки, чтобы получить более конкретные рекомендации.