Ошибка PostgreSQL «Не удалось подключиться к серверу: нет такого файла или каталога»

136

Как и некоторые другие, я получаю эту ошибку, когда запускаю rake db: migrate в своем проекте или даже пробую большинство задач с базами данных для моих приложений Ruby on Rails 3.2.

PGError (не удалось подключиться к серверу: такого файла или каталога нет. Сервер работает локально и принимает подключения через сокет домена Unix "/tmp/.s.PGSQL.5432"?

Я установил PostgreSQL вместе с Homebrew очень давно, и после недавней попытки установить MongoDB моя установка PostgreSQL никогда не была прежней. Я использую OS X v10.6 Snow Leopard.

Что не так и как мне лучше понять, как PostgreSQL должен и должен быть установлен на моем Mac?

Пока (я думаю) это говорит мне о том, что PostgreSQL не работает (?).

ps -aef|grep postgres                                                                                                   (ruby-1.9.2-p320@jct-ana) (develop) 
  501 17604 11329   0   0:00.00 ttys001    0:00.00 grep postgres

Но говорит ли это, что PostgreSQL работает?

 launchctl load -w /usr/local/Cellar/postgresql/9.1.4/homebrew.mxcl.postgresql.plist                                                        (ruby-1.9.2-p136) 
homebrew.mxcl.postgresql: Already loaded

Как это исправить? что я не вижу?

PS: ~/Library/LaunchAgentsвключает в себя два файла PostgreSQL .plist. Я не уверен, что это актуально.

org.postgresql.postgres.plist
homebrew.mxcl.postgresql.plist

Я попробовал следующее и получил результат, как показано ниже.

$ psql -p 5432 -h localhost

psql: could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?
could not connect to server: Connection refused
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 5432?
could not connect to server: Connection refused
    Is the server running on host "localhost" (fe80::1) and accepting
    TCP/IP connections on port 5432?

С тех пор я читал, что это происходит потому, что OS X устанавливает свою собственную версию PostgreSQL, а Homebrew устанавливает другую версию в другом месте, а команды PostgreSQL находятся в каталоге / tmp /. Вам нужно будет поискать больше о переполнении стека, но в основном вы используете символическую ссылку PostgreSQL, чтобы все, что просматривает этот путь tmp, действительно находило реальный путь, если это имеет смысл.

Это ссылка, в которой я нашел несколько вещей, которые можно попробовать, в частности, используя символическую ссылку, как указано выше, Mac OSX Lion Postgres не принимает соединения в /tmp/.s.PGSQL.5432 . Я все еще хотел бы, чтобы кто-нибудь собрал достойное объяснение концепций, лежащих в основе установки PostgreSQL на OS X, и почему все это так сложно.

Последние идеи, которые помогут с устранением неполадок:

$ which psql // This tells you which PostgreSQL you are using when you run $ psql. 

Затем запустите:

$ echo $PATH

Главное, что нужно принять во внимание, это:

Убедитесь, что запись пути для копии PostgreSQL, которую вы хотите запустить, COMES ДО пути к PostgreSQL системы OS X.

Это основное требование, которое решает, какой PostgreSQL будет запущен, и, как мне говорят, приводит к большинству из этих проблем.

Evolve
источник
Вы когда-нибудь находили решение для этого? Я вижу, вы не отметили один. Ничто из этого мне тоже не поможет.
Андрас Гомрей
Это все еще в основном vodoo и странные воплощения, чтобы заставить это работать. Я только что добавил [Изменить 2] выше со ссылкой с некоторыми дополнительными предложениями и как сделать символическую ссылку согласно моим комментариям редактирования. В конце концов, Symlink сработал для меня, но я думаю, что я также удалил и переустановил postgres и homebrew там по пути, так что трудно точно понять, что имело значение. Удачи. Сообщите, если вы обнаружите что-то новое, с 15 000 просмотров по этому вопросу, это то, что причиняет боль многим людям!
развиваться
@AndrasGyomrey Я только что вернулся с RailsCamp15 в Австралии, и люди сказали, что ключом к тому, чтобы правильно настроить файл пути, я отредактировал в Edit 3 выше, чтобы объяснить это.
развиваться
Имейте в виду, что launchctl, сообщающий о чем-то загруженном, не обязательно означает, что он запущен и работает. Вы должны взглянуть на bigsql.com в качестве альтернативы; работает на Mac и имеет хороший интерфейс управления.
Джим Насби

Ответы:

102

Проверьте, нет ли postmaster.pid в вашем каталоге postgres, возможно /usr/local/var/postgres/

удалите это и запустите сервер.

Проверьте - https://github.com/mperham/lunchy - отличная оболочка для launchctl.

Хасс
источник
3
Это сработало для меня. Я только что установил свежий yosemite и загрузил postgres из доморощенного. Работал нормально, когда я впервые использовал его, но после перезапуска возникла эта проблема. Итак, вы можете объяснить, почему это сработало?
Дэн Уильямс
2
работал для меня, но для новичков, может кто-нибудь объяснить, почему и насколько это безопасно
Александр Миллс
59

« Postgres.app » лучше исправить, если вы работаете в OS X


Вот исправление:

  1. Остановить базу данных
  2. cd /var
  3. rm -r pgsql_socket
  4. ln -s /tmp pgsql_socket
  5. chown _postgres:_postgres pgsql_socket
  6. Перезапустите PostgreSQL (не ваш компьютер)

Более подробная информация доступна на " postgresql 9.0.3. На Lion Dev Preview 1 ".

josephmisiti
источник
2
Вернулись ошибки для меня, и это исправление не помогло. Я чувствую, что я наткнулся в темной комнате на работу, чтобы понять, что на самом деле происходит, и сам процесс исправления. Могли бы вы объяснить, как я могу диагностировать и устранить эту проблему?
развиваться
Работает для меня. Чувствую себя немного странно в /tmp_postgres, но эй :)
wrdevos
Postgresapp работает, но почему я не могу запустить свой сервер в терминале? После того, как я вышел из этого приложения, проблема вернулась, как и ожидалось.
хакунами
Это сработало для меня, но учтите, что вы должны быть пользователем root или использовать sudo для выполнения # 2 - 4. Также, пожалуйста, поясните шаг # 5 - вам нужно только перезагрузить postgres, а не компьютер.
mpelzsherman
2
Заглавные буквы не дают лучшего ответа. Все еще прекрасно установить и запустить Postgres через Homebrew (сервисы)
Drenmi
55

Для меня это работает

rm /usr/local/var/postgres/postmaster.pid
tsunllly
источник
9
В моем случае после удаления pid мне нужно было перезапустить postgresql с помощьюpg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
Obromios
4
Я также должен был перезапустить postgres, при установке homebrew, вы можете сделать это так:brew services restart postgresql
santuxus
2
Я нахожусь в доке env No such file or directoryв моем случае
Sarz
2
rm: /usr/local/var/postgres/postmaster.pid: нет такого файла или каталога
nourza
13

Это сработало для меня из-за ошибки, которую вы упомянули. Сделайте одно из них:

  1. Возможно, измените порт по умолчанию, указанный в postgres.confфайле, если вы использовали что-то другое, чем порт по умолчанию 5432при установке.

  2. Измените номер порта postgresql.confи перезапустите сервер БД.

  3. Вместо того, чтобы psqlвводить полную команду:

    psql -p 5432 -h localhost   
    • имя сервера и номер порта
solaimuruganv
источник
1. Я думаю, что моя установка была бы по умолчанию.
развиваться
2. Я мог бы изменить это, какие-либо последствия изменения порта?
развиваться
3. Добавлен мой вывод из 3 выше.
развиваться
Вариант 3 работал с пользовательским портом. Поскольку у меня установлено несколько серверов pg (PostgreSQL 9.1, 9.2 и 9.3), мне также пришлось указать на правильный psql.
gpasse
11

Если вы используете Homebrew, удалите Postgresql end pg gems: *

$ gem uninstall pg
$ brew uninstall postgresql

Загрузите и запустите следующий сценарий, чтобы исправить разрешение на / usr / local: * https://gist.github.com/rpavlik/768518

$ ruby fix_homebrew.rb

Затем снова установите Postgres и введите pg gem: *

$ brew install postgresql  
$ initdb /usr/local/var/postgres -E utf8

Для запуска запустите postgresql при входе в систему:

$ ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents 

Или начать вручную.

Установить pg gem

$ gem install pg

Надеюсь помог

Фабрисио
источник
От brew info postgres:ARCHFLAGS="-arch x86_64" gem install pg
wrdevos
1
Разве это не удалит записи в БД?
kibaekr
initdb /usr/local/var/postgres -E utf8работает. Огромное спасибо.
Крис Чон
8

У меня была эта проблема, когда я обновил Postgres до 9.3.x. Быстрым решением для меня было понижение до той версии 9.2.x, которая была у меня до этого (не нужно устанавливать новую).

$ ls /usr/local/Cellar/postgresql/
9.2.4
9.3.2
$ brew switch postgresql 9.2.4
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
<open a new Terminal tab or window to reload>
$ psql

« Homebrew установить конкретную версию формулы? » Предлагает гораздо более полное объяснение, а также альтернативные способы решения проблемы.

silvenon
источник
Спасибо за вклад и четкие инструкции, чтобы повторить ваше исправление. Эта ссылка, которую вы включили, безусловно, является исчерпывающей, в настоящее время у меня нет проблем с postgres, поэтому я не уверен, насколько она пока полезна для других, но для всех остальных, если вы найдете это полезным, пожалуйста, прокомментируйте здесь
развиваться
Я считаю это полезным и актуальным, хотя, возможно, не напрямую. Он решил проблему, просто переключая версии, используя brew, который является довольно распространенным инструментом, и просто повторил шаги, но пока, замечательно, ссылка попадает в более специфичные для brew проблемы, поэтому я вижу, что вы сомневаетесь в ее ценности. в контексте вопроса ОП.
августа
7

Я исправил это, обновив postgres.

brew update
brew upgrade

Затем мне пришлось обновить базы данных, чтобы они были совместимы с новой основной версией, потому что я обновил с 10 до 11.

brew postgresql-upgrade-database

(источник https://github.com/facebook/react-native/issues/18760#issuecomment-410533581 )

Нелу
источник
Я получил эту ошибку Ошибка: не установлена ​​версия postgresql 9.3. *!
Нурза
5

Так что для многих проблем здесь, кажется, что люди уже запускали psql и должны были удалить postmaster.pid . Тем не менее, у меня не было этой проблемы, так как у меня никогда не было должным образом установлено postgres в моей системе.

Вот решение, которое работало для меня в MAC OSX Yosemite

  1. Я пошел на http://postgresapp.com/ и загрузил приложение.
  2. Я переместил приложение в каталог Application /
  3. Я добавил его в $ PATH, добавив его в .bashrc или .bash_profile или .zshrc: export PATH=$PATH:/Applications/Postgres.app/Contents/Versions/latest/bin
  4. Я запустил postgres из каталога Applications и снова запустил команду, и она заработала.

Надеюсь это поможет! Toodles!

Кроме того, этот ответ помог мне больше всего: https://stackoverflow.com/a/21503349/3173748

superjisan
источник
Разве это не указывает на приложение Postgres, а не на установку brew? Это может отрезать вас от некоторых полезных пакетов (например, pgrouting, которые вы не можете установить для приложения Postgres, которое вызвало у меня бесконечное горе, и вот я здесь)
allthesignals
4

Когда вы запускаете: psql -p 5432 -h localhost, он не использует драйвер обратной связи, а использует настоящий сокет, и, следовательно, вам необходимо настроить postgres для приема соединений сокетов. Следовательно, даже если pgadmin и другие клиенты могут работать, psql не будет.

Вам нужно изменить как файл postgresql.conf, так и файлы pg_hba.conf, чтобы разрешить соединение через реальный сокет. Это также позволит установить соединение с удаленного IP-адреса, поэтому по умолчанию оно отключено.

Эти файлы находятся в каталоге данных, но фактическое расположение может отличаться в зависимости от того, как был установлен postgres. Запустив postgres, запустите команду:

ps -ef | grep postmaster

Эти два файла являются каталогом -D (может быть, / usr / local / pgsql / data).

Для файла postgresql.conf раскомментируйте адрес прослушивания и измените его следующим образом:

listen_address = '*'

Для pg_hba.conf добавьте строку:

host all all 0.0.0.0/0 md5
oenpelli
источник
2

Я не очень хорошо знаю Mac или Homebrew, но хорошо знаю PostgreSQL.

Вы хотите выяснить, откуда берутся журналы из PostgreSQL и каков каталог сокетов для PostgreSQL. По умолчанию при сборке PG каталог сокета / tmp /. Если вы не изменили это при сборке PG, а затем запустили PG, вы сможете увидеть файл сокета в / tmp, если выполните: ls -al / tmp

Файл сокета начинается с ".", Поэтому вы не увидите его с "-a" до ls.

Если вы не видите там сокета и ничего не видите от ps awux | grep postgres, то, возможно, PG не запущен, а может, и установлен OSX. Может случиться так, что у вас может возникнуть конфликт при прослушивании порта 5432 на localhost - используйте netstat -anp, чтобы увидеть, что, если вообще что-то прослушивается на 5432. Если Mac OSX PG уже прослушивает этот порт, то это может быть проблемой.

Надеюсь, это поможет. Я слышал, что доморощенный может сделать вещи немного уродливыми, и многие люди, с которыми я разговаривал, поощряют использование ВМ вместо этого.

Стивен Фрост
источник
Спасибо за участие в этом. Если это поможет вам получить больше информации, homebrew просто запускает этот скрипт при установке postgres. github.com/Homebrew/homebrew-core/blob/master/Formula/… Я надеюсь, что вы могли бы взглянуть на него и, возможно, поделиться дальнейшими знаниями о том, что вы найдете. Я думаю, что люди нуждаются в более простом способе отладки, почему они получают эту ошибку, чтобы они знали, какое действие предпринять.
Эволюция
Исходя из того, что я могу понять из этого сценария, в каталоге «var», возможно, в HOMEBREW_PREFIX находится файл «postgres.log». Этот файл журнала будет содержать информацию о попытке PG запустить (в том числе, если по какой-то причине он не запустился). Вот пример сообщения, показывающего, что PG не запускается из-за другого процесса, прослушивающего порт 5432:
Стивен Фрост
2016-12-19 09: 11: 59.582 EST [20669] LOG: не удалось привязать сокет IPv4: адрес уже используется 2016-12-19 09: 11: 59.582 EST [20669] СОВЕТ: Другой почтмейстер уже работает на порту 5432 ? Если нет, подождите несколько секунд и повторите попытку. 2016-12-19 09: 11: 59.582 EST [20669] ПРЕДУПРЕЖДЕНИЕ: не удалось создать прослушивающий сокет для «localhost» 2016-12-19 09: 11: 59.582 EST [20669] FATAL: не удалось создать TCP / IP-сокеты 2016 -12-19 09: 11: 59.582 EST [20669] LOG: система базы данных выключена
Стивен Фрост
Кроме того, похоже, что этот скрипт не меняет каталог сокетов по умолчанию, поэтому он должен быть / tmp /. Вы можете найти в каталоге данных PG (который выглядит как {HOMEBREW_PREFIX} / var / postgres) файл postgresql.conf и найти «unix_socket_directories». Он закомментирован по умолчанию, но имеет набор по умолчанию, например:
Стивен Фрост
#unix_socket_directories = '/ tmp' # список каталогов через запятую
Стивен Фрост
2

Я столкнулся с этой ошибкой при запуске на Mac 10.15.5 с использованием homebrew.

Существует файл с именем postmaster.pid, который автоматически удаляется при выходе из postresql.

Если это не делает следующее

  • brew services stop postgresql <--- Не удается завершить работу до того, как rm может испортить базу данных
  • sudo rm /usr/local/var/postgres/postmaster.pid
RobKohr
источник
1

Причина

Lion поставляется с уже установленной версией postgres и использует эти двоичные файлы по умолчанию. В общем, вы можете обойти это, используя полный путь к бинарным файлам homebrew postgres, но могут быть проблемы с другими программами.

Решение

curl http://nextmarvel.net/blog/downloads/fixBrewLionPostgres.sh | ш

Через

http://nextmarvel.net/blog/2011/09/brew-install-postgresql-on-os-x-lion/

SOCOM
источник
1

Одна из причин, по которой вы получаете эту ошибку, заключается в том, что ваша локальная база данных postgres завершает работу при перезагрузке компьютера. В новом окне терминала просто введите:

$psql -h localhost 

перезагрузить сервер.

Pstrazzulla
источник
1

Привет, мир :)
Лучший, но странный способ для меня - делать следующие вещи.

1) Загрузите postgres93.app или другую версию. Добавьте это приложение в папку / Applications /.

2) Добавить строку (команду) в файл .bash_profile(который находится в моем домашнем каталоге):

экспорт PATH = / Приложения / Postgres93.app / Содержание / MacOS / bin /: $ PATH
Это путь к psqlот Postgres93.app. Строка (команда) запускается каждый раз при запуске консоли.

3) Запустить Postgres93.appиз /Applications/папки. Он запускает локальный сервер (порт «5432», а хост «localhost»).

4) После всех этих манипуляций я был рад запустить $ createuser -SRDP user_nameи другие команды и убедиться, что это сработало! Postgres93.appможно заставить работать каждый раз, когда ваша система запускается.

5) Кроме того, если вы хотите увидеть свои базы данных в графическом виде, вы должны установить PG Commander.app. Это хороший способ увидеть вашу базу данных postgres как красивые таблицы данных

Конечно, это полезно только для локального сервера. Я буду рад, если эта инструкция поможет другим, кто столкнулся с этой проблемой.

crazzyaka
источник
1

У меня был PostgreSQL 9.3 и я получил ту же ошибку,

Не удалось подключиться к серверу: соединение отклонено. Сервер работает на хосте «localhost» (127.0.0.1) и принимает соединения TCP / IP через порт 5432?

Я исправил это с помощью:

chmod 777  /var/lib/pgsql/9.3/data/pg_hba.conf 
service postgresql-9.3 restart

Меня устраивает.

Махеш Шитоле
источник
Этот файл не существует для меня
allthesignals
1

что бы это ни стоило, я столкнулся с такой же ошибкой, когда в моем файле ( md4вместо md5) была опечатка pg_hba.conf( /etc/postgresql/9.5/main/pg_hba.conf)

Если вы попали сюда, как я, дважды проверьте этот файл, чтобы убедиться, что там нет ничего смешного.

Зак Ламберти
источник
где pg_hba.confфайл?
Бубказуба
1
/etc/postgresql/ndompostgres_version‹/main/pg_hba.conf
Эйдан Мелен
0

Могут быть разные проблемы с локальным запуском PostgreSQL. Я бы порекомендовал очистить все установленные версии postgres и начать все заново. После того, как вы установили его, очень легко воссоздать вашу базу данных, если у вас есть проект rails с последней версиейdb/schema.rb

Вот как я обычно устанавливаю PostgreSQL на Mac . Если вы используете свою базу данных под пользователем root локально, вы можете пропустить последний шаг, который создает todoпользователя

Алекс Тамойкин
источник
0

Одной из причин может быть то, что

unix_socket_directories в файле postgresql.conf не указан в каталоге, который он ищет.

В примере с вопросом он ищет каталог / tmp, это должно быть указано в файле postgresql.conf

что-то вроде этого:

unix_socket_directories = '/var/run/postgresql,/tmp'    # comma-separated list of directories

Это решение сработало для меня.

Киран К Телукунта
источник
0

Если вы работаете в MacOS и используете homebrew, я нашел этот ответ чрезвычайно полезным:

https://stackoverflow.com/a/27708774/4062901

Для меня мой сервер работал, но из-за обновления у меня были проблемы с подключением (примечание: я использую службы brew). Если Postgres работает, попробуйтеcat /usr/local/var/postgres/server.log посмотреть, что в журналах написано. Моя ошибка была миграцией, а не проблемой подключения.

Кроме того, после ручной миграции, которую они предлагают (что работает, но), я обнаружил, что для моего пользователя больше нет таблицы. Попробуйте эту команду, чтобы исправить это: createdb(ответ через psql: FATAL: база данных "<пользователь>" не существует )

rickrizzo
источник
0

Просто перезапустите Postgres, как только появится ошибка, brew services restart postgresqlи попробуйте снова

Канке
источник
0

для меня команда rm /usr/local/var/postgres/postmaster.pid не работает, потому что я установил конкретную версию postgresql с homebrew.

правильная команда rm /usr/local/var/postgres@10/postmaster.pid .

тогда brew services restart postgresql@10.

ZinkLu
источник
-5

Это очень просто. Добавьте хост только в ваш файл database.yaml.

Рикардо - Nextv
источник
host: 127.0.0.1 или host: localhost, например.
Рикардо - Nextv
Каждый любит простое решение. Но как это работает? Как я уже говорил в моих комментариях выше, поиск этого привел меня ко многим сложным маршрутам. Можете ли вы уточнить и рассказать нам немного больше о том, что вы видите на самом деле, и как это простое изменение решает проблему. Спасибо за помощь в этом! :)
развиваться
Разница в том, что с IP-соединением не нужно беспокоиться о том, где находится файл сокета; вместо этого вы беспокоитесь об IP-адресе.
Джим Насби