PostgreSQL работает локально, но я не могу подключиться. Зачем?

32

Недавно я обновил мой компьютер с Mac OS X Lion (10.7.4) до Mountain Lion (10.8), и я думаю, что он помешал моей установке PostgreSQL. Первоначально он был установлен через Homebrew. Я не администратор баз данных, но надеюсь, что кто-нибудь подскажет мне, как это устранить.

Я не могу подключиться (но смог раньше, чем пред-Горный Лев):

$ psql -U rails -d myapp_development
psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?

Но Postgres все еще явно работает:

$ ps aux | grep postgres
meltemi          2010   0.0  0.0  2444124   5292   ??  Ss   Wed01PM   0:00.02 postgres: rails myapp_development [local] idle    
meltemi           562   0.0  0.0  2439312    592   ??  Ss   Wed12PM   0:02.28 postgres: stats collector process       
meltemi           561   0.0  0.0  2443228   1832   ??  Ss   Wed12PM   0:01.57 postgres: autovacuum launcher process       
meltemi           560   0.0  0.0  2443096    596   ??  Ss   Wed12PM   0:02.89 postgres: wal writer process       
meltemi           559   0.0  0.0  2443096   1072   ??  Ss   Wed12PM   0:04.01 postgres: writer process       
meltemi           466   0.0  0.0  2443096   3728   ??  S    Wed12PM   0:00.85 /usr/local/bin/postgres -D /usr/local/varpostgres -r /usr/local/var/postgres/server.log

И он отвечает на запросы (как тестовой базы данных, так и базы разработки) из локального приложения Rails

  User Load (0.2ms)  SELECT "users".* FROM "users" 
  Rendered users/index.html.haml within layouts/application (1.3ms)

Кажется, что нет никакого /var/pgsql_socket/каталога, не говоря уже о /var/pgsql_socket/.s.PGSQL.5432файле сокета, упомянутом выше!?! Может быть, установка Mountain Lion уничтожила это?

$ ls -l /var/ | grep pg
drwxr-x---   2 _postgres  _postgres    68 Jun 20 16:39 pgsql_socket_alt

Как я могу устранить это?

Мельтеми
источник
Не администратор postgres, а отсутствующий файл сокета звучит примерно так. Создайте каталог / var / pgsql_socket (у вашего пользователя есть права на запись) и перезапустите сервер. Посмотри, исправит ли это
Дерек Дауни
Похожий вопрос по SO . Похоже, что Apple не проделала большую работу с обновлением.
Эрвин Брандштеттер
есть ли упоминание о создании файла сокета в файле журнала /usr/local/var/postgres/server.log?
Philᵀᴹ
@ErwinBrandstetter Как вы ожидаете, что Apple выполнит «хорошую работу» по обновлению установленных сторонних * nix-приложений, установленных вручную?
Philᵀᴹ
@ Фил - без упоминания. Я начинаю думать, что это может быть проблема переменной пути. Я думаю, что мои $PATHизменения с обновлением /usr/binвпереди, /usr/local/binи я думаю, что Mountain Lion может прийти с предустановленным PostgreSQL!?! Расследование ...
Мелтеми

Ответы:

30

Я обнаружил, что у меня была чрезвычайно похожая проблема, а именно, что postgres открывал сокет, в /var/pgsql_socket_altкоторый не должно было смотреть ни одно из моих программ, но решение моей проблемы было не только проблемой с моим $PATH.

Я должен был создать каталог /var/pgsql_socket, Чаун его к себе, и множество unix_socket_directoryв postgresql.conf(расположен в /usr/local/var/postgres) в этот каталог, а затем использовать pg_ctlбинарный файл в , /usr/local/binчтобы начать правильный сервер Postgres успешно (что, где $PATHприходит - убедиться , which pg_ctlПОСТАНОВЛЯЕТ /usr/local/bin/pg_ctl, или просто всегда назовите это явно).

Это может помочь другим пользователям, которые найдут этот вопрос через /var/pgsql_socket_altупоминание.

Будет
источник
Интересный. Ты тоже на Горном льве? Вы установили PostgreSQL с помощью Homebrew? Если это так, спросите себя, может ли кто-нибудь еще проверить это решение, а не изменить мое, $PATHкак я это сделал.
Мелтеми
Да, да, и я на это надеюсь!
Будет
@wolftron ваше решение было для меня ударом (Mountain Lion, доморощенный / postgres, / var / pgsql_socket_alt, целых девять). Это новый выпуск Mountain Lion с домашним пивом? Я открою билет с ними, если вы так думаете.
Похоже, мы получили подтверждение от @Jamie.
Уилл
Я могу подтвердить эту проблему и решение на OS X 10.8.2 / brew установка postgresql 9.2.1.
Хартвиг
8

Правдоподобным и типичным объяснением было бы то, что то, psqlчто идет с homebrew, /usr/local/bin/psqlотличается от того, которое будет в вашем $ PATH, например /usr/bin/psql(в комплекте с OS X). Вы можете попробовать с полным путем:

$ /usr/local/bin/psql -U rails -d myapp_development

Кроме того, в psвыводе вашего вопроса есть что-то довольно необычное : сервер postgres работает под meltemiпользователем Unix, тогда как обычно для этого используется выделенный postgresпользователь Unix.

Даниэль Верите
источник
Также _postgres(с подчеркиванием) для пользователя / группы мне неизвестно. Это артефакт или ожидается?
Эрвин Брандштеттер
Да, это похоже на $PATHпроблему, как вы заявили. Вещи работают как прежде, когда я использую /usr/local/bin/psqlдля доступа к базе данных. Либо у Lion не было системы PostgreSQL, либо мой $ PATH был настроен по-другому. Прошёл год с тех пор, как я в последний раз запутался в этом, поэтому точно не помню. Что касается пользователя Unix ... при установке Homegrew PostgreSQL сервер запускается с помощью launchd, и пользователь по умолчанию настроен на локального пользователя, который его установил. Все настроено по-другому на Mac OS X Server, который автоматически запускает PostgreSQL postgres.
Мелтеми
4

Я не знаю ни одного файла конфигурации для клиента PSQL. Однако psql учитывает ряд переменных окружения, которые соответствуют параметрам командной строки.

Таким образом, чтобы psql автоматически использовал сокет по вашему выбору, вы можете установить переменную PGHOST в каталог, содержащий сокет. т.е.

PGHOST=/var/pgsql_socket_alt
psql -d mydatabsase
happynix
источник
1
Это нигде не задокументировано. Я могу найти, что вы можете установить PGHOST в каталог, где находятся файлы сокетов. Но это на самом деле работает. Благодарность!
Андрей Шульман
3

Пытаться:

psql -U rails -d myapp_development -h localhost

или

psql -U rails -d myapp_development -h 127.0.0.1
Miguel
источник
3

Поздно, но я нашел это полезным: http://tammersaleh.com/posts/install-postgresql-for-rails-3-1-on-lion

Это было для Lion, но у меня были те же проблемы, что и в этой теме, после обновления с 10.6.8 до Mountain Lion и установки PostgreSQL через HomeBrew до 10.6.8. У меня также была таинственная /var/pgsql_socket_altпапка после обновления, но я просто удалил ее и создал /var/pgsql_socketв соответствии с предложением @wolftron. Однако это не было окончательным решением.

Если я оставлю unix_socket_directoryпустым / закомментированный в postgresql.conf, любые проекты, существующие до обновления, будут жаловаться на отсутствие сокета /var/pgsql_socket. Но если бы я изменил conf и был жестко запрограммирован var/pgsql_socket, любые новые проекты жаловались бы на отсутствие сокета /tmp. Очень расстраивает ... пока я не переустановил pg gemпроект до 10.8 ( gem uninstall pg && gem install pg) и не оставил unix_socket_directoryкомментарий в confфайле. После быстрой pg_ctlперезагрузки сервера работали как новые, так и старые проекты. Мой сокет pgsql живет /tmpсейчас, между прочим.

Sidenote: если вы используете activerecord-postgresql-adaptergem, сначала удалите его, затем переустановите pg, затем установите activerecord-postgresql-adapterснова.

Ступня
источник
2

Я только что подписался на dba SE, так что, похоже, я не могу комментировать соответствующий пост (что за чудо!).

Однако я был уверен, что был в той же лодке, что и @thure. Я удостоверился, что / usr / local / bin был раньше в моем PATH, чем / usr / bin, проверил, какие двоичные файлы оболочка хэшировала, whichи typeт. Д.

Я видел те же симптомы, что и @thure. Тогда у меня было прозрение; Я понял, что перестроил pgгем (я использую Ruby) в оболочке, на PATH которой негативно повлиял path_helper для Mac (которая запускается из / etc / profile и помещает / usr / bin перед / usr / local / bin) ,

Я удалил pg и переустановил его в оболочке, путь которой был правильным. Внезапно я смог подключиться!

Поэтому убедитесь, что вы перекомпилируете людей с языковыми привязками и дайте им найти правильную копию (предположительно) pg_config.

Грэм Эштон
источник
1

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

sudo ln -s /var/pgsql_socket_alt /var/pgsql_socket

в соответствии с принятым ответом @thure, но проще.

Дэнни Робертс
источник
1

Вот и наступил 2016 год, El Capitan вышел, и Apple продолжает что-то менять. Postgres устанавливается как часть операционной системы, а файл конфигурации postgres устанавливает свойство unix_socket_directories в postgresql.conf равным / tmp. Сокет находится в /tmp/.s.PGSQL.5432. Я смог обойти проблему, выполнив следующее:

sudo ln -s /tmp /var/pgsql_socket

Надеюсь, это кому-нибудь поможет.

rdiddly
источник
1

Ищите правильный файл сокета

find / -name .s.PGSQL.5432 -ls

Из результата получите путь к файлу и используйте путь с параметром "-h" в команде psql

Например, вот как я подключаюсь к базе данных календаря и контактов сервера macOS (в рамках ssh-сессии с сервером):

sudo psql -U _calendar -h /private/var/run/caldavd/PostgresSocket/ -d caldav

Затем файл сокета в пути будет использоваться для подключения.

Олаф Сейферт
источник
1

По умолчанию postgres пытается подключиться через unix-domain-sockets. UNIX ДОМЕННАЯ РОЗЕТКА

Это случилось со мной, когда я запускал экземпляр postgres на докере. Вы должны увидеть, какое соединение принимает ваш сервер. Для меня это был явно TCP, а не сокет домена unix.

Добавление флага для принятия хоста перенаправило соединение на правильный путь и устранило проблему.

psql -U username -p port -h host

PS: доменные сокеты Unix работают на уровне ядра, и соединение не должно проходить через весь джаз, необходимый для соединений TCP. Они довольно быстрые и эффективные, если вы хотите подключиться к своей машине из другого процесса в рамках межпроцессного взаимодействия.

Судип Бхандари
источник
0

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

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
источник
0

Я получил эту же ошибку при попытке запустить psqlв командной строке. Оказалось, что мое решение было намного проще. Я неправильно настроил порт прослушивания в файле конфигурации: /etc/postgresql/9.4/main/postgres.conf . Я изменил порт с порта = 5432 на порт = 5433. Когда я изменил его обратно на 5432, он работал как ожидалось.

Чтобы проверить, сделали ли вы что-то подобное, вы можете запустить $ psql -p5433 Есть несколько полезных опций, подобных этой, для команды psql, которые вы можете найти здесь: http://www.postgresql.org/docs/9.4/static/app-psql .html, чтобы вы могли проверить свою СОБСТВЕННУЮ неверную конфигурацию. Конечно, вы можете просто удалить свой последний набор изменений конфигурации из файлов * .conf, чтобы проверить, не являются ли они источником вашей проблемы. Я думаю, что, безусловно, стоит проверить, прежде чем копаться в правах доступа к файлам и владельцам. (Только не забудьте /etc/init.d/postgresql restart)

Чего я НЕ смог найти, так это файла конфигурации, который устанавливает значения по умолчанию для команды CLI psql. Кто-нибудь может прокомментировать это, пожалуйста?

Для меня я всегда возвращаюсь к своему первому принципу программирования: «Я обычно являюсь источником любой данной ошибки!»

MaybeWeAreAllRobots
источник