Не вдається підключитися до локального 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). Я вже кілька місяців керую Левом, тож здається дивним, що це має статися зараз.

Я не хочу занадто багато возитися, не розуміючи, в чому проблема. Як я можу це налагодити методично?

Як я можу визначити, скільки версій PostgreSQL є в моїй системі, до якої з них звертається і де вона знаходиться? Як виправити це, якщо використовується неправильний PostgreSQL?

Вибачте за питання про noob. Я все ще вчуся, як це працює! Дякуємо за будь-які покажчики.

EDIT

Деякі оновлення на основі пропозицій та коментарів нижче.

Я спробував запустити, 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 за замовчуванням та ???

Потім я здійснив пошук сценарію запуску startctl, 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

Це питання почалося після того, як у мене виникли деякі проблеми з демонстрацією. Мої локальні програми Rails виходили з помилки програми у рядку "дорогоцінний камінь не можна знайти". Потім я пройшов ряд оновлень пакетів, оновлень дорогоцінних каменів, оновлень портів та оновлень варити, щоб спробувати знайти проблему.

Чи може ця помилка бути проблемою з демоном?


Зауважте, що коли ваша програма підключається, вона підключається через порт tcp замість сокета домену unix. Тому вам потрібно налаштувати postgres, щоб прийняти мережеві з'єднання, принаймні від localhost.
Пол Томблін

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


Саме так. Здається, це мак-річ. ОП може використовувати прапор -h, після того, як перевірить, чи працює пошта.
wildplasser

Будь ласка, опублікуйте вихід pg_lsclustersі ваш pg_hba.confфайл.
цчо

Відповіді:


66

Це дійсно схоже на помилку дозволу на файл. Універсальні розетки Unix - це файли, які мають дозволи користувачів, як і будь-які інші. Схоже, користувач OSX, який намагається отримати доступ до бази даних, не має дозволу на доступ до файлу сокета. Для підтвердження цього я зробив кілька тестів на Ubuntu та psql, щоб спробувати створити ту саму помилку (включену нижче).

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

Ви можете змінити дозволи на dir для себе, але сокет налаштовано 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"

Файл сокета відсутній:

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

Універсальний сокет існує, але сервер його не слухає.

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
пройшло певний час, щоб пролізти через мої каталоги та знайти потрібні файли, але це справді було проблемою. Дякую за дуже детальну відповідь. Як тільки я знайшов правильний каталог, мені потрібно було встановити каталог socket, каталог даних, hba_file та ident_file у postgresql.conf. Дякую!
Енді Гарві

1
Можливо, я можу допомогти деяким людям: я використовував Brew для установки postgres під свій обліковий запис. У моєму випадку виявилося, що папку / var / pgsql_socket / належить користувачеві _postgres і змінивши право власності на мій обліковий запис (darren) виправлено цю проблему. Не впевнений, чому brew не встановив належним чином право власності на цю папку в першу чергу ...?
Даррен Йенсен

Дякую, милі. Я не зміг підключитися, і налаштування unix_socket_directory було правильним.
Ryan Bigg

41

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

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

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

Якщо 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 до моєї database.yml вирішило мою проблему. Дякую :)
Automatico

1
моє в / приватне / .... дивацтво. Я заварив його, але раніше у цього ноутбука були проблеми. Дивно. що database.yml був ключовим!
pjammer

4
Дивно. Додавання "localhost" до моєї database.yml також працювало, але чому так? У мене цього раніше не було, і все працювало нормально. Але я не думаю, що я щось із пізнього додавав, і раптом це вже було так. > _ <
індекс

1
фокусом для мене тут був шлях socket - це було в / run not / var / run - спасибі!
qodeninja

26

Спробуйте видалити pg gem ( gem uninstall pg), а потім перевстановити - якщо ви використовуєте bundler, то bundle install, elsegem install pg . Крім того, переконайтеся, що шлях підбирає правильну версію: Lion має версію posgresql (попередні версії не були), і вона може бути в шляху до локально встановленої версії (наприклад, MacPorts, homebrew).

У моєму випадку: встановлення homebrew of postgresql, оновлений postgresql, rails тощо, після чого отримали цю помилку. Видалення та перевстановлення драйвера pg зробило це для мене.


8
bundle exec gem незайманий pg <== також зробить трюк
Бен Уолдінг

Я не сумніваюся, помилка ОП може бути викликана будь-якою кількістю речей, але це рішення, яке працювало для мене.
redhotvengeance

20

Розташування файлу сокета випікається в самоцвіт під час компіляції. Таким чином, вам потрібно відновити ваш pg дорогоцінний камінь.

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
Після того, як я це зробив (і Ніла, і Рафа), я отримав "Fatal" в базі даних не існує помилки. Тож побігли "rake db: create: all" та "rake db: migrate" і, нарешті, все працювало заново.
Дебора

Я також повинен був rm -rf /usr/local/var/postgresтоді робити initdb /usr/local/var/postgres -E utf8. Але переконайтеся, що післязаписи не виконуються, коли ви це зробите, інакше каталог буде відтворений майже негайно.
Josh W Lewis

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

Дякую :) Це допомогло. Але перед тим, як створити symlink, не забудьте створити sudo mkdir /var/run/postgresqlпапку (у моєму випадку ідентифікатор не існував і не був створений інсталятором для pg 9.3.X).
kovpack

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

6

Я почав отримувати це після оновлення до нового постгресу - я не розумів, що маю файли даних.

Спочатку я спробував запустити сервер 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
Саме це вирішило проблему для мене. Мій комп'ютер замерз, і мені довелося зробити сильне відключення. Коли я запустив його назад, постгрес сказав, що « psql: could not connect to server: No such file or directory.Видалити postmaster.pidз /usr/local/var/postgresроботи все знову працювати».
Ryan Epp

1
Так було і зі мною. Мій комп'ютер перезапустився через паніку з ядром, і мені довелося видалити postmaster.pid, перш ніж повернутися до роботи.
Бен

4

Я отримував цю саму помилку (виявляється, це була помилка з postmaster.pid. Ось, як я отримав постгрес і запускався знову ( кредит Рікардо Бурільо для виправлення ):

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

Це працювало для мене, хоча pg_resetxlogповернений `файл блокування" postmaster.pid "існує.
Еліза

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

Я прочитав багато тем про цю помилку, і для мене було вирішенням просто перезапустити постгреси:

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

Я деякий час шукав рішення. Отже, ця проблема вирішила і для мене (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 з пивом.


2

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

Перейдіть до папки

cd /usr/local/var/postgres

Перевірте, чи не присутній postmaster.pid

ls

Видаліть postmaster.pid

rm postmaster.pid

2

У моєму випадку жодне з попередніх рішень не було хорошим. Замість використання socket можна використовувати 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 зі свого Gemfile, перекомпонував, відновив посилання на pg та ще раз відскочив.

Після цього це спрацювало як шарм.


1

Привіт світ :)
Найкращий, але дивний спосіб для мене був робити наступні справи.

1) Завантажте postgres93.app або іншу версію. Додайте цю програму в / програми / папку.

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

експортувати PATH = / Програми / Postgres93.app / Зміст / MacOS / бін /: $ PATH
Це шлях до psqlз Postgres93.app. Рядок (команда) виконується кожного разу, коли запускається консоль.

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

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

5) Крім того, якщо ви хочете графічно бачити свої бази даних, вам слід встановити PG Commander.app. Це хороший спосіб бачити ваші БД постгрес як гарні таблиці даних

Звичайно, це корисно лише для локального сервера. Я буду радий, якщо ці інструкції допоможуть іншим, хто зіткнувся з цією проблемою.


0

У мене виникла ця проблема, і після подальшого дослідження (запуску rake db:setup) я побачив, що рейли намагаються підключитися до раніше використовуваного екземпляра 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процес, нарешті зупинився. Сподіваюся, це допомагає.


0
gem uninstall pg

В ОС X з домашньою мовою:

gem install pg -- --with-pg-config=/usr/local/bin/pg_config
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.