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


124

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

Все мои локальные приложения 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). Я пользуюсь Lion несколько месяцев, поэтому кажется странным, что это должно произойти сейчас.

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

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

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

РЕДАКТИРОВАТЬ

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

Я попытался запустить и 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 по умолчанию и ???.

Затем я выполнил поиск сценария запуска launchctl, 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 не может быть найден». Затем я прошел через серию обновлений пакетов, обновлений драгоценных камней, обновлений портов и обновлений brew, чтобы попытаться найти проблему.

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


Обратите внимание, что когда ваше приложение подключается, оно подключается через порт TCP, а не через сокет домена unix. Итак, вам нужно настроить postgres для приема сетевых подключений, по крайней мере, от localhost.
Пол Томблин

Почему вы так считаете? Очевидно, драйверы пытаются подключиться через сокет Unix. Хотя розетку ищут не в том месте.
Милен А. Радев


Именно. Похоже, это макинтош. OP может использовать флаг -h после проверки того, что почтмейстер запущен.
wildplasser

Пожалуйста, опубликуйте вывод pg_lsclustersи свой pg_hba.confфайл.
tscho

Ответы:


66

Это действительно похоже на ошибку прав доступа к файлу. Доменные сокеты 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.

РЕДАКТИРОВАТЬ:

Я произвел быстрый поиск в Google, и вы, возможно, захотите посмотреть, является ли он релевантным. Это вполне может привести к 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, чтобы они были запущены. Смущенный!
Энди Харви

Я добавил дополнительную ссылку. Насколько я знаю, у вас не может быть postgresql без postgresql.conf (даже если он был переименован). Ваша первая задача должна заключаться в том, чтобы найти это.
Филип Коулинг,

1
потребовалось некоторое время, чтобы просмотреть мои каталоги и найти нужные файлы, но это действительно была проблема. Спасибо за очень подробный ответ. Как только я нашел правильный каталог, мне нужно было установить каталог сокета, каталог данных, hba_file и ident_file в postgresql.conf. Спасибо!
Энди Харви

1
Может помочь некоторым людям: я использовал brew для установки postgres под своей учетной записью. В моем случае оказалось, что папка / var / pgsql_socket / принадлежала пользователю _postgres, и изменение права собственности на мою учетную запись (darren) устранило эту проблему. Не уверен, почему brew изначально не установил права собственности на эту папку правильно ...?
Даррен Дженсен

Спасибо, кулинг. Мне не удалось подключиться, и установка unix_socket_directory была правильным решением.
Райан Бигг

41

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

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

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

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

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

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

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

  • psql -h localhost mydbname,

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

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

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

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

host: localhost

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

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

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


1
@wildplasser спасибо за ваш ответ. Это заставило меня двигаться в правильном направлении, и подробный ответ Кулинга дал решение.
Энди Харви

6
Добавление хоста: localhost в мою базу данных .yml устранило мою проблему. Спасибо :)
Automatico

1
мой находится в / private / .... странности. Я установил его, но и с этим ноутбуком раньше были проблемы. Weird. этот database.yml был ключевым!
pjammer 07

4
Weird. Добавление "localhost" в мою базу данных также сработало, но почему? У меня этого раньше не было, и все работало нормально. Но не думаю, что в последнее время что-то добавлял, а вдруг так уже было. > _ <
индекс

1
Уловкой для меня был путь к сокету - он был в / run, а не в / var / run - спасибо!
qodeninja

26

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

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


8
bundle exec gem pristine pg <== тоже подойдет
Бен Уолдинг

Я не сомневаюсь, что ошибка OP может быть вызвана множеством причин, но это решение, которое сработало для меня.
redhotvengeance 01

20

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

gem pristine pg
# or
bundle exec gem pristine pg

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


У меня возникла проблема, описанная в этом вопросе, после того, как я начал обновлять 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
У меня всегда время от времени возникает эта проблема, но я впервые решаю ее с помощью ЭТОГО решения. Кроме того, пришлось rm -fr /usr/local/var/postgresперед запускомinitb
Раф

1
После того, как я сделал это (и Нила, и Рафа), я получил ошибку "Неустранимая" база данных не существует. Затем запустили rake db: create: all и rake db: migrate, и, наконец, все снова заработало.
Deborah

Мне тоже пришлось rm -rf /usr/local/var/postgresтогда заняться initdb /usr/local/var/postgres -E utf8. Но при этом убедитесь, что postgres не запущен, иначе каталог будет воссоздан почти сразу.
Джош Льюис

8

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

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

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


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

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
ardochhigh

Спасибо :) Это помогло. Но перед созданием символической ссылки не забудьте создать sudo mkdir /var/run/postgresqlпапку (в моем случае id не существовал и не был создан установщиком для pg 9.3.X).
kovpack

2
О, это решение оказалось «разовым» решением, которое мне приходилось переделывать после каждой перезагрузки. Для Rails я нашел другое решение - изменить файл конфигурации базы данных (добавлен ответ ниже).
kovpack

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 - связанный с ошибкой несовместимости: /server/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

Просто подтверждаю, что у меня была аналогичная проблема с 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, прежде чем вернуться к работе.
Бен

4

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

$ rm /usr/local/var/postgres/postmaster.pid 
$ pg_resetxlog -f /usr/local/var/postgres

У меня это сработало, хотя pg_resetxlogвозвращенный файл блокировки postmaster.pid существует.
Elise

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, проблема была исправлена.
bratsche

Решил проблему для меня на 4.1.0.beta1
Андреас

3

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

sudo service postgresql restart

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


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"?

Некоторое время я искал решение. Итак, это тоже устранило проблему для меня (переустановить 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 с пивом.


2

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

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

cd /usr/local/var/postgres

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

ls

Удалить postmaster.pid

rm postmaster.pid

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

Получил эту ошибку, когда настраивал 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

1

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

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

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


1

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

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

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

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

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

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

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

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


0

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

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

источник: https://stackoverflow.com/a/17420624/2577622


0

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

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.