Не удается подключиться к локальному PostgreSQL

123

Мне удалось обработать локальную среду разработки.

Все мои локальные приложения Rails теперь выдают ошибку:

PGError
could not connect to server: Permission denied
    Is the server running locally and accepting
    connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?

Я не знаю, что вызвало это.

При поиске решения я обновил все связанные драгоценные камни, обновленные системные камни, обновленные MacPorts. Нет радости.

Другие сообщили об этой проблеме при обновлении с OSX Leopard до Lion из-за путаницы в отношении того, какую версию Postgres следует использовать (например, версию OSX или версию MacPorts). Я работаю с Лев в течение нескольких месяцев, поэтому кажется странным, что это должно произойти сейчас.

Я не хочу слишком много обходиться без предварительного понимания проблемы. Как я могу отлаживать эту методику?

Как определить, сколько версий PostgreSQL находится в моей системе, к какому из них обращаются, и где он находится? Как исправить это, если используется неправильный PostgreSQL?

Извините за вопросы noob. Я все еще изучаю, как это работает! Спасибо за любые указатели.

ИЗМЕНИТЬ

Некоторые обновления основаны на предложениях и комментариях ниже.

Я попытался запустить pg_lsclusters, который возвратил ошибку command not found.

Затем я попытался локально установить файл pg_hba.conf и нашел эти три файла образца:

/opt/local/share/postgresql84/pg_hba.conf.sample
/opt/local/var/macports/software/postgresql84/8.4.7_0/opt/local/share/postgresql84/pg_hba.conf.sample
/usr/share/postgresql/pg_hba.conf.sample

Итак, я предполагаю, что установлены 3 версии PSQL? Macports, OSX по умолчанию и???.

Затем я выполнил поиск запуска startct script ps -ef | grep postgres, который вернул

0    56     1   0 11:41AM ??         0:00.02 /opt/local/bin/daemondo --label=postgresql84-server --start-cmd /opt/local/etc/LaunchDaemons/org.macports.postgresql84-server/postgresql84-server.wrapper start ; --stop-cmd /opt/local/etc/LaunchDaemons/org.macports.postgresql84-server/postgresql84-server.wrapper stop ; --restart-cmd /opt/local/etc/LaunchDaemons/org.macports.postgresql84-server/postgresql84-server.wrapper restart ; --pid=none
  500   372     1   0 11:42AM ??         0:00.17 /opt/local/lib/postgresql84/bin/postgres -D /opt/local/var/db/postgresql84/defaultdb
  500   766   372   0 11:43AM ??         0:00.37 postgres: writer process                                                                                                                                                                                                                                                                                                                   
  500   767   372   0 11:43AM ??         0:00.24 postgres: wal writer process                                                                                                                                                                                                                                                                                                               
  500   768   372   0 11:43AM ??         0:00.16 postgres: autovacuum launcher process                                                                                                                                                                                                                                                                                                      
  500   769   372   0 11:43AM ??         0:00.08 postgres: stats collector process                                                                                                                                                                                                                                                                                                          
  501  4497  1016   0 12:36PM ttys000    0:00.00 grep postgres

Я разместил содержимое postgresql84-server.wrapper в http://pastebin.com/Gj5TpP62.

Я попытался запустить port load postgresql184-server, но получил ошибку Error: Port postgresql184-server not found.

Я все еще очень смущен, как это исправить, и оцените любые указатели "для чайников".

Спасибо!

EDIT2

Эта проблема началась после того, как у меня возникли проблемы с daemondo. Мои локальные приложения Rails рушились с ошибкой приложения по строкам "daemondo gem не удалось найти". Затем я просмотрел ряд обновлений пакетов, обновлений gem, обновлений портов и обновлений brew, чтобы попытаться найти проблему.

Может ли эта ошибка быть проблемой с daemondo?

  • 0
    Обратите внимание, что когда ваше приложение подключается, оно подключается через порт tcp вместо сокета домена unix. Таким образом, вам нужно настроить postgres для приема сетевых подключений, по крайней мере, от localhost.
  • 0
    Почему ты так веришь? Очевидно, что драйверы пытаются подключиться через сокет Unix. Хотя они ищут розетку не в том месте.
Показать ещё 5 комментариев
Теги:
macos

21 ответ

67
Лучший ответ

Это действительно похоже на ошибку разрешения файлов. Сокеты домена Unix являются файлами и имеют пользовательские разрешения, как и любые другие. Похоже, что пользователь OSX, пытающийся получить доступ к базе данных, не имеет прав доступа к файлу сокета. Чтобы это подтвердить, я провел несколько тестов на Ubuntu и psql, чтобы попытаться создать ту же ошибку (см. Ниже).

Вам нужно проверить разрешения на файл сокета и его каталоги /var и /var/pgsql_socket. Приложение Rails (пользователь OSX) должно иметь разрешения на выполнение (x) в этих каталогах (предпочтительно предоставить разрешения для каждого пользователя), а сокет должен иметь полные разрешения (wrx). Вы можете использовать ls -lAd <file>, чтобы проверить их, и если какая-либо из них является символической ссылкой, вам нужно проверить файл или каталог, на который указывает ссылка.

Вы можете изменить разрешения для каталога, но сокет настраивается postgres в postgresql.conf. Это можно найти в том же каталоге, что и pg_hba.conf (вам нужно выяснить, какой из них). После того, как вы установите разрешения, вам необходимо перезапустить postgresql.

# postgresql.conf should contain...
unix_socket_directory = '/var/run/postgresql'       # dont worry if yours is different
#unix_socket_group = ''                             # default is fine here
#unix_socket_permissions = 0777                     # check this one and uncomment if necessary.

EDIT:

Я сделал быстрый поиск в google, который вы, возможно, захотите изучить, чтобы убедиться, что он relavent. Это может привести к любой попытке find сбой вашего файла конфигурации.

http://www.postgresqlformac.com/server/howto_edit_postgresql_confi.html


Сообщения об ошибках:

Пользователь не найден в pg_hba.conf

psql: FATAL:  no pg_hba.conf entry for host "[local]", user "couling", database "main", SSL off

Ошибка авторизации пользователя:

psql: FATAL:  password authentication failed for user "couling"

Отсутствует файл сокета unix:

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

Unix-сокет существует, но сервер не прослушивает его.

psql: could not connect to server: Connection refused
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

Плохие права доступа к файлам файлов unix:

psql: could not connect to server: Permission denied
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
  • 1
    спасибо за эти идеи @couling. Это похоже на правильное направление. Но есть кое-что очень странное с моей настройкой. Имейте в виду, что до недавнего времени это работало идеально. Я просмотрел три каталога postgres в моей системе, все они содержат файлы conf.sample (pg_hba, pg_ident, pg_service и т. Д.), Но не содержат файлов .conf. Это не должно быть так, правильно? Также каталог, который должен содержать .s.PGSQL.5432, пуст. Вместо этого у меня есть файл, расположенный в /private/tmp/.s.PGSQL.5432.lock. PS возвращает процессы postgres, поэтому он работает. Смущенный!
  • 0
    Я добавил дополнительную ссылку. Насколько я знаю, у вас не может быть postgresql без postgresql.conf (даже если он был переименован). Ваша первая задача должна быть найти это.
Показать ещё 5 комментариев
39

У меня возникает ощущение, что это (снова) вещь mac/OSX: передняя часть и задняя часть предполагают другое место для сокета unix-домена (которое функционирует как точка рандеву).

Контрольный список:

  • Работает postgres: ps aux | grep postgres | grep -v grep должен делать трюк
  • Где находится сокет: find / -name .s.PGSQL.5432 -ls (используемый сокет в /tmp; вы можете начать искать там)
  • даже если вы найдете сокет (unix-domain), клиент может использовать другое местоположение. (это происходит, если вы смешиваете дистрибутивы или у вас есть дистрибутив, установленный где-то, и у вас есть другая (например, из источника) установка в другом месте), при этом клиент и сервер используют разные адреса rendez-vous.

Если postgres запущен и сокет действительно существует, вы можете использовать:

  • psql -h /the/directory/where/the/socket/was/found mydbname

(который пытается подключиться к сокету unix-domain)

; вы должны теперь получить приглашение psql: попробуйте \d, а затем \q, чтобы выйти. Вы также можете  попробуйте:

  • psql -h localhost mydbname.

(который пытается подключиться к localhost (127.0.0.1)

Если эти попытки не выполняются из-за недостаточной авторизации, вы можете изменить pg_hba.conf(и SIGHUP или перезапустить). В этом случае: также проверьте журналы.

Аналогичный вопрос: Не удается запустить Postgres

Примечание. Если вы можете перейти к приглашению psql, быстрое исправление этой проблемы - это просто изменить config/database.yml, add:

host: localhost

или вы можете попробовать добавить:

host: /the/directory/where/the/socket/was/found

В моем случае host: /tmp

  • 0
    Как я указал в моем ответе ниже, pg_hba.conf генерирует другую ошибку. Иначе да, что-то не так с размещением имени и использованием сокета.
  • 1
    @wildplasser спасибо за ваш ответ. Это заставило меня начать в правильном направлении, и подробный ответ Кулинга дал решение.
Показать ещё 10 комментариев
25

Попробуйте удалить pg gem (gem uninstall pg), а затем переустановить - если вы используете bundler, то bundle install, else gem install pg. Кроме того, убедитесь, что путь выбирает правильную версию: у Lion есть версия posgresql (предыдущие версии не были), и она может быть на пути до вашей локально установленной версии (например, MacPorts, homebrew).

В моем случае: homebrew install postgresql, обновил postgresql, rails и т.д., а затем получил эту ошибку. Удаление и переустановка pg gem сделали это для меня.

  • 8
    bundle exec gem нетронутый pg <== также добьется цели
  • 0
    Я не сомневаюсь, что ошибка OP может быть вызвана любым количеством причин, но это решение, которое сработало для меня.
19

Местоположение файла сокета запекается в драгоценный камень во время компиляции. Таким образом, вам нужно восстановить свой жемчуг pg.

gem pristine pg
# or
bundle exec gem pristine pg

Это должно решить эту проблему.

  • 0
    Я начал понимать проблему, описанную в этом вопросе, после того, как brew обновил Postgres с 9.1x до 9.3x. Этот ответ исправил это для меня (так же, как и добавление localhost к моему database.yml, но этот подход мне нравится больше).
16

Если вы получаете аналогичную ошибку:

psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

Это может сделать трюк (это было для меня):

initdb /usr/local/var/postgres -E utf8

Указанный каталог должен отличаться, если вы не используете OSX/ Brew.

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

  • 6
    У меня всегда возникает эта проблема время от времени, но я впервые решаю ее с помощью ЭТОГО решения. Кроме того, перед запуском initb пришлось выполнить rm -fr /usr/local/var/postgres
  • 1
    После того, как я сделал это (как Нила, так и Рафа), я получил сообщение «Неустранимая» ошибка базы данных. Затем запустили «rake db: create: all» и «rake db: migrate» и, наконец, все снова заработало.
Показать ещё 1 комментарий
8

для меня эта ошибка разрешила удаление файла postmaster.pid в каталоге postgres. см. мой вопрос/ответ, используя следующую ссылку для пошаговых инструкций. моя проблема не была связана с правами доступа к файлам:

psql: не удалось подключиться к серверу: нет такого файла или каталога (Mac OS X)

люди, ответившие на этот вопрос, бросили много игр, хотя, спасибо за это! я поддержал все, что мог

  • 0
    Поскольку принятый ответ здесь указывает на проблему с правами доступа к файлу, кажется очевидным, что ваш пост и этот пост не связаны.
7

Вот как я решил это сообщение об ошибке, частично основанное на ответе wildplasser.

find / -name .s.PGSQL.5432 -ls 2> /dev/null
  => ... /tmp/.s.PGSQL.5432

Итак, есть мой сокет или что-то еще, но клиент ищет его по адресу:

/var/run/postgresql/.s.PGSQL.5432

Так просто сделайте символическую ссылку на /tmp/.s.PGSQL.5432:

sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432

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

  • 1
    Это сработало для меня: sudo ln -s /tmp/.s.PGSQL.5432 /var/pgsql_socket/.s.PGSQL.5432
  • 0
    Спасибо :) Это помогло. Но перед созданием symlink не забудьте создать папку sudo mkdir /var/run/postgresql (в моем случае id не существовал и не был создан программой установки для pg 9.3.X).
Показать ещё 1 комментарий
6

Я начал получать это после обновления до новых postgres - я не понимал, что у меня есть файлы данных.

Сначала я попытался запустить сервер postgres:

postgres -D /usr/local/var/postgres

как я видел эту ошибку

FATAL:  database files are incompatible with server
DETAIL:  The data directory was initialized by PostgreSQL version 9.0, which is not compatible with this version 9.3.5.

Итак, я нашел этот ответ на SO - связан с ошибкой несовместимости: https://serverfault.com/questions/342626/how-do-i-upgrade-postgresl-database-incompatibility-error

Это то, что фиксировало его

mv /usr/local/var/postgres /usr/local/var/postgres.old
initdb -D /usr/local/var/postgres
4

Я получал эту же ошибку (оказалось, что это была ошибка с postmaster.pid. Вот как я получил postgres снова и снова (кредит Рикардо Бурильо за исправление):

$ rm /usr/local/var/postgres/postmaster.pid 
$ pg_resetxlog -f /usr/local/var/postgres
  • 0
    Это сработало для меня, хотя pg_resetxlog вернул `файл блокировки" postmaster.pid "существует.
4

Просто подтверждая, что у меня была аналогичная проблема с PSQL и Django,

Похоже, что мой psql-сервер не был закрыт правильно, и файл postmaster.pid все еще присутствовал (должен быть удален при правильном выключении автоматически) в моей папке postgres.

Удалено это и все хорошее

  • 2
    Это то, что решило проблему для меня. Мой компьютер завис, и мне пришлось сделать полное отключение. Когда я запустил его снова, postgres говорил, что psql: could not connect to server: No such file or directory. Удаление postmaster.pid из /usr/local/var/postgres заставило все снова работать.
  • 1
    Это было и то, что случилось со мной. Мой Mac перезапустился из-за паники ядра, и мне пришлось удалить postmaster.pid, прежде чем вернуться к работе.
3
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

Я искал решение какое-то время. Итак, этот вопрос также исправил для меня (reinit db):

rm -r /usr/local/var/postgres  
initdb /usr/local/var/postgres -E utf8  
pg_ctl -D /usr/local/var/postgres -l logfile start

Я использую OS X 10.11.3 с brew.

3

У меня была аналогичная проблема при попытке использовать postgresql с рельсами. Обновление моего Gemfile для использования новой версии gem pg для решения этой проблемы. (работает gem pg версия 0.16.0). В Gemfile используйте:

gem 'pg', '0.16.0'

затем выполните следующее, чтобы обновить драгоценный камень

bundle install --without production
bundle update
bundle install
  • 1
    Это решило проблему и для меня. Я был на 0.15.1 от прохождения бета-версии Rails 4.0, а теперь использую Ruby 2.0.0. Как только я обновился до pg 0.16.0, проблема была исправлена.
  • 0
    Решил проблему для меня на 4.1.0.beta1
2

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

sudo service postgresql restart

Это не упоминается здесь.

2

Получил эту ошибку, когда я настраивал Posgtres с Django, я использую Back Track, и он поставляется с установленным Postgres. Я предполагаю, что это проблема. Я исправил его, полностью удалив его, затем переустановив.

sudo apt-get remove postgresql
sudo apt-get purge postgresql

Теперь запустите:

apt-get --purge remove postgresql\*

чтобы удалить все PostgreSQL из вашей системы. Просто очистить пакет postgres недостаточно, поскольку это просто пустой мета-пакет.

После удаления всех пакетов PostgreSQL запустите:

rm -r /etc/postgresql/
rm -r /etc/postgresql-common/
rm -r /var/lib/postgresql/
userdel -r postgres
groupdel postgres

Теперь вы должны иметь возможность:

apt-get install postgresql
2

В моем случае ни одно из предыдущих решений не было хорошим. Вместо использования сокета вы можете использовать номер TCP host + port в файле конфигурации Rails. Поэтому в файле database.yml просто добавьте две строки, как здесь:

...
adapter: postgresql
encoding: unicode
pool: 5
host: localhost
port: 5432

Это решило мою проблему:)

Прежде чем использовать это исправление:

sudo mkdir /var/run/postgresql
sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432

Но после каждой перезагрузки /tmp/.s.PGSQL.5432 был удален, и мне пришлось повторять эти команды. Решение работает, но это ужасно, поэтому лучше всего изменить файл конфигурации базы данных Rails:)

2

Это случилось со мной сегодня после того, как моя батарея Macbook умерла. Я думаю, это может быть вызвано неправильным отключением. Все, что вам нужно сделать в таких случаях, как мой, - удалить postmaster.pid

Перейдите в папку

cd /usr/local/var/postgres

Проверьте, присутствует ли postmaster.pid

ls

Удалить postmaster.pid

rm postmaster.pid
1

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

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

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

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

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

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

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

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

1

MacOSX здесь. У меня была такая же проблема после обновления моей установки postresql от pre-9.1 до 9.1.2 с использованием homebrew. (Кстати, не забудьте сбросить базы данных до вашего обновления с помощью pg_dump, базы данных до 9.1 несовместимы.) Такая же проблема, те же сообщения об ошибках.

Деинсталляция pg gem сделала трюк для меня. На самом деле мне нужно было немного потанцевать, чтобы обнаружить эту проблему. Сначала я удалил глобальную жемчужину, очистив колоду от всех старых драгоценных камней (их было несколько). Затем я удалил pg из своего Gemfile, переработал, восстановил ссылку pg и снова отскочил.

После этого он работал как шарм.

0

Я пробовал большинство решений этой проблемы, но не мог заставить их работать.

Я запустил lsof -P | grep ':5432' | awk '{print $2}', который показал PID процесса. Однако я не мог убить его с помощью kill -9 <pid>.

Когда я запустил pkill postgresql, процесс, наконец, остановился. Надеюсь, это поможет.

0

У меня возникла эта проблема, и после дальнейшего расследования (запуск rake db:setup) я увидел, что рельсы пытались подключиться к ранее использованному экземпляру postgres - такому, который хранился в переменных env как DATABASE_URL.

Исправление: unset DATABASE_URL

источник: https://stackoverflow.com/questions/17417852/rails-activerecord-connecting-to-wrong-postgres-database

0
gem uninstall pg

В OS X с Homebrew:

gem install pg -- --with-pg-config=/usr/local/bin/pg_config

Ещё вопросы

Сообщество Overcoder
Наверх
Меню