Impossibile connettersi a PostgreSQL locale


124

Sono riuscito a migliorare il mio ambiente di sviluppo locale.

Tutte le mie app Rails locali ora danno l'errore:

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

Non ho idea di cosa sia stato causato.

Durante la ricerca di una soluzione ho aggiornato tutte le gemme in bundle, le gemme di sistema aggiornate, i MacPort aggiornati. Nessuna gioia.

Altri hanno segnalato questo problema durante l'aggiornamento da OSX Leopard a Lion, a causa della confusione su quale versione di Postgres dovrebbe essere utilizzata (cioè versione OSX o versione MacPorts). Gestisco Lion da diversi mesi, quindi sembra strano che ciò accada ora.

Sono riluttante a scherzare troppo senza prima capire qual è il problema. Come posso eseguire il debug metodicamente?

Come posso determinare quante versioni di PostgreSQL sono sul mio sistema, a quale si accede e dove si trova? Come posso risolvere questo problema se si utilizza PostgreSQL errato?

Ci scusiamo per le domande su Noob. Sto ancora imparando come funziona! Grazie per eventuali suggerimenti.

MODIFICARE

Alcuni aggiornamenti basati su suggerimenti e commenti di seguito.

Ho provato a eseguire pg_lsclustersche ha restituito un command not founderrore.

Ho quindi provato a localizzare il mio file pg_hba.conf e ho trovato questi tre file di esempio:

/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

Quindi suppongo che siano installate 3 versioni di PSQL? Macport, OSX predefinito e ???.

Ho quindi fatto una ricerca per lo script di avvio launchctl ps -ef | grep postgresche è tornato

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

Ho pubblicato il contenuto di postgresql84-server.wrapper su http://pastebin.com/Gj5TpP62 .

Ho provato a correre port load postgresql184-serverma ho ricevuto un errore Error: Port postgresql184-server not found.

Sono ancora molto confuso su come risolvere questo problema e apprezzo qualsiasi puntatore "per i manichini".

Grazie!

EDIT2

Questo problema è iniziato dopo che ho avuto alcuni problemi con daemondo. Le mie app Rails locali si stavano arrestando in modo anomalo con un errore dell'applicazione simile a "impossibile trovare Daemondo Gem". Ho quindi esaminato una serie di aggiornamenti di bundle, gemma, aggiornamenti delle porte e aggiornamenti della birra per cercare di trovare il problema.

Questo errore potrebbe essere un problema con daemondo?


Quando l'app si connette, si connette tramite la porta tcp anziché il socket del dominio unix. Quindi devi configurare postgres per accettare le connessioni di rete, almeno da localhost.
Paul Tomblin,

Perché ci credi? Ovviamente i driver stanno provando a connettersi tramite socket Unix. Anche se cercano la presa nel posto sbagliato.
Milen A. Radev,


Esattamente. Sembra essere un mac-cosa. OP potrebbe usare il flag -h, dopo aver verificato che il postmaster è in esecuzione.
wildplasser,

Pubblica l'output di pg_lsclusterse il tuo pg_hba.conffile.
Tscho,

Risposte:


66

Sembra davvero un errore dei permessi dei file. I socket di dominio Unix sono file e dispongono di autorizzazioni utente come qualsiasi altro. Sembra che l'utente OSX che tenta di accedere al database non disponga delle autorizzazioni per accedere al file socket. Per confermare questo ho fatto alcuni test su Ubuntu e psql per provare a generare lo stesso errore (incluso di seguito).

È necessario controllare le autorizzazioni per il file socket e le sue directory /vare /var/pgsql_socket. L'app Rails (utente OSX) deve disporre delle autorizzazioni di esecuzione (x) su queste directory (preferibilmente concedere a tutti i permessi) e il socket deve disporre di autorizzazioni complete (wrx). Puoi usarli ls -lAd <file>per controllare questi, e se qualcuno di loro è un link simbolico, devi controllare il file o il dir verso cui punta il link.

Puoi modificare i permessi sulla directory per te stesso, ma il socket è configurato da Postgres in postgresql.conf. Questo può essere trovato nella stessa directory di pg_hba.conf(Dovrai capire quale). Dopo aver impostato i permessi dovrai riavviare 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.

MODIFICARE:

Ho fatto una rapida ricerca su Google che potresti voler esaminare per vedere se è relavent. Ciò potrebbe comportare findla mancata riuscita del tentativo di errore del file di configurazione.

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


Messaggio di errore:

Utente non trovato in pg_hba.conf

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

Autenticazione password fallita utente:

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

File socket unix mancante:

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

Il socket Unix esiste, ma il server non lo ascolta.

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

Autorizzazioni per file errati sul file socket 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
grazie per queste idee @couling. Sembra la giusta direzione. Ma c'è qualcosa di molto strano nella mia configurazione. Tieni presente che questo ha funzionato perfettamente fino a poco tempo fa. Ho esaminato le tre directory postgres sul mio sistema, tutte contengono file conf.sample (pg_hba, pg_ident, pg_service, ecc.) Ma nessun file .conf. Questo non dovrebbe essere il caso, giusto? Anche la directory che dovrebbe contenere .s.PGSQL.5432 è vuota. Invece ho un file che si trova in /private/tmp/.s.PGSQL.5432.lock. PSrestituisce i processi postgres in modo che sia in esecuzione. Confuso!
Andy Harvey,

Ho aggiunto un link extra. Per quanto ne so, non puoi davvero avere postgresql senza postgresql.conf (anche se è stato rinominato). Il tuo primo compito deve essere quello di trovare questo.
Philip Couling,

1
ci è voluto del tempo per esplorare le mie directory e trovare i file giusti, ma questo era davvero il problema. Grazie per la risposta molto dettagliata. Una volta trovata la directory corretta, avevo bisogno di impostare la directory socket, la directory dei dati, hba_file e ident_file in postgresql.conf. Grazie!
Andy Harvey,

1
Potrebbe aiutare alcune persone: ho usato brew per installare Postgres sotto il mio account. Nel mio caso si è scoperto che la cartella / var / pgsql_socket / era di proprietà dell'utente _postgres e la modifica della proprietà sul mio account (darren) ha risolto questo problema. Non sai perché brew non abbia impostato correttamente la proprietà di questa cartella in primo luogo ...?
Darren Jensen,

Grazie couling. Non sono riuscito a connettermi e impostare la directory unix_socket_ era la cosa giusta da fare.
Ryan Bigg,

41

La mia sensazione è che questo sia (di nuovo) una cosa mac / OSX: il front-end e il back-end assumono una posizione diversa per il socket del dominio unix (che funziona come punto di incontro ).

Elenco di controllo:

  • Postgres è in esecuzione: ps aux | grep postgres | grep -v grepdovrebbe fare il trucco
  • Dove si trova il socket: find / -name .s.PGSQL.5432 -ls(il socket era in / tmp; si poteva iniziare a guardare lì)
  • anche se si individua il socket (dominio unix), il client potrebbe utilizzare una posizione diversa. (questo accade se si mescolano distribuzioni o se si dispone di una distribuzione installata da qualche parte e si dispone di un'altra installazione (ad esempio dalla fonte) altrove), con client e server che utilizzano indirizzi di appuntamento diversi.

Se postgres è in esecuzione e il socket esiste effettivamente, è possibile utilizzare:

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

(che tenta di connettersi al socket del dominio unix)

; ora dovresti ottenere il prompt psql: prova \de poi \qper uscire. Puoi anche provare:

  • psql -h localhost mydbname.

(che tenta di connettersi a localhost (127.0.0.1)

Se questi tentativi falliscono a causa di un'autorizzazione insufficiente, è possibile modificare pg_hba.conf (e SIGHUP o riavviare) In questo caso: controllare anche i registri.

Una domanda simile: impossibile avviare Postgres

Nota: se riesci a visualizzare il prompt di psql, la soluzione rapida a questo problema è solo quella di cambiare il tuo config/database.yml, aggiungi:

host: localhost

oppure potresti provare ad aggiungere:

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

Nel mio caso, host: /tmp


1
@wildplasser grazie per la tua risposta. Questo mi ha fatto iniziare nella giusta direzione e la risposta dettagliata di Couling ha dato la soluzione.
Andy Harvey,

6
L'aggiunta dell'host: localhost al mio database.yml ha risolto il mio problema. Grazie :)
Automatico,

1
il mio è in / privato / .... stranezza. L'ho installato, ma questo laptop aveva problemi troppo prima. Strano. quel database.yml era la chiave!
Pjammer,

4
Strano. Anche l'aggiunta di "localhost" al mio database.yml ha funzionato, ma perché? Non l'avevo mai fatto prima e tutto funzionava bene. Ma non credo di aver aggiunto nulla di recente e all'improvviso era già così. > _ <
indice

1
il trucco per me qui era il percorso del socket - era in / run not / var / run - grazie!
qodeninja,

26

Provare a disinstallare la gemma pg ( gem uninstall pg) quindi reinstallare - se si utilizza bundler, poi bundle install, il resto gem install pg. Inoltre, assicurati che path prenda la versione giusta: Lion ha una versione di posgresql (le versioni precedenti no) e potrebbe trovarsi nel percorso precedente alla versione installata localmente (es. MacPorts, homebrew).

Nel mio caso: installazione homebrew di postgresql, postgresql aggiornato, rotaie, ecc. E quindi errore. La disinstallazione e reinstallazione di pg gem è stata adatta a me.


8
bund exec exec gem pristine pg <== farà anche il trucco
Ben Walding

Non ho dubbi che l'errore del PO possa essere causato da un numero qualsiasi di cose, ma questa è la soluzione che ha funzionato per me.
redhotvengeance,

20

La posizione del file socket viene inserita nella gemma al momento della compilazione. Quindi è necessario ricostruire la tua gemma PG.

gem pristine pg
# or
bundle exec gem pristine pg

Questo dovrebbe risolvere quel particolare problema.


Ho iniziato a ottenere il problema descritto in questa domanda dopo aver aggiornato Postgres da 9.1x a 9.3x. Questa risposta l'ha risolto per me (così ha aggiunto 'localhost' al mio database.yml, ma mi piace meglio questo approccio).
Joshua Flanagan,

16

Se ricevi un errore simile:

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

Questo potrebbe fare il trucco (lo ha fatto per me):

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

La directory specificata dovrebbe essere diversa se non si utilizza OSX / Brew.

Nota: questo non è il messaggio di errore esatto visto sopra, ma questo thread è il primo risultato per quel messaggio di errore.


6
Ogni tanto finisco sempre per avere questo problema, ma questa è la prima volta che lo risolvo con QUESTA soluzione. Inoltre, ho dovuto rm -fr /usr/local/var/postgresprima di correreinitb
Raf il

1
Dopo averlo fatto (sia di Neal che di Raf), ho riscontrato che il database "Fatal" non esiste. Quindi ho eseguito "rake db: create: all" e "rake db: migrate" e alla fine tutto ha funzionato di nuovo.
Deborah,

Ho anche dovuto fare rm -rf /usr/local/var/postgresallora initdb /usr/local/var/postgres -E utf8. Ma assicurati che postgres non sia in esecuzione quando lo fai, altrimenti la directory viene ricreata quasi immediatamente.
Josh W Lewis,

8

ciò che ha risolto questo errore per me è stato l'eliminazione di un file chiamato postmaster.pid nella directory postgres. per favore vedi la mia domanda / risposta usando il seguente link per istruzioni dettagliate. il mio problema non era correlato alle autorizzazioni dei file:

psql: impossibile connettersi al server: nessun file o directory (Mac OS X)

le persone che hanno risposto a questa domanda hanno abbandonato molto il gioco, grazie per quello! ho votato tutto ciò che potevo


Poiché la risposta accettata qui rileva un problema relativo alle autorizzazioni dei file, sembra evidente che il tuo post e questo non siano correlati.
Andrew Barber,

7

È così che ho risolto quel messaggio di errore, basato in parte sulla risposta di wildplasser.

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

Quindi, c'è il mio socket o altro, ma il client lo cerca:

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

Quindi basta semplicemente creare un collegamento simbolico a /tmp/.s.PGSQL.5432:

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

Spero che questo aiuti a chiunque. Sembra un po 'sbagliato, ma ehi, funziona!


1
Questo ha funzionato per me: sudo ln -s /tmp/.s.PGSQL.5432 /var/pgsql_socket/.s.PGSQL.5432
ardochhigh

Grazie :) Questo ha aiutato. Ma prima di creare un collegamento simbolico non dimenticare di creare una sudo mkdir /var/run/postgresqlcartella (nel mio caso l'id non esisteva e non era stato creato dall'installer per pg 9.3.X).
kovpack,

2
Oh, questa soluzione si è rivelata una soluzione "una tantum" che ho dovuto rifare dopo ogni riavvio. Per Rails ho trovato un'altra soluzione: modificare il file di configurazione del database (aggiunta la risposta di seguito).
kovpack,

6

Ho iniziato a ottenerlo dopo l'aggiornamento a un nuovo postgres: non mi rendevo conto di avere dei file di dati in sospeso.

Per prima cosa ho provato ad avviare il server Postgres:

postgres -D /usr/local/var/postgres

ed è così che ho visto questo errore

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.

Quindi ho trovato questa risposta su SO - correlata a un errore di incompatibilità: /server/342626/how-do-i-upgrade-postgresl-database-incompatibility-error

Questo è ciò che l'ha risolto

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

4

Confermando che ho avuto un problema simile su PSQL e Django,

Sembrava che il mio server psql non fosse spento correttamente e il file postmaster.pid fosse ancora presente (dovrebbe essere cancellato automaticamente all'arresto corretto) nella mia cartella postgres.

Eliminato questo e tutto bene


2
Questo è ciò che ha risolto il problema per me. Il mio computer si è bloccato e ho dovuto fare un arresto. Quando l'ho riavviato, Postgres stava dicendo che psql: could not connect to server: No such file or directory.Rimozione postmaster.pidda /usr/local/var/postgrestutto ha funzionato di nuovo.
Ryan Epp,

1
Questo è stato anche quello che mi è successo. Il mio mac è stato riavviato a causa del panico del kernel e ho dovuto eliminare postmaster.pid prima di tornare al lavoro.
Ben

4

Stavo ottenendo lo stesso errore (si è scoperto che era un errore postmaster.pid. Ecco come ho messo Postgres di nuovo attivo e funzionante ( merito a Ricardo Burillo per la correzione ):

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

Questo ha funzionato per me, anche se pg_resetxlogesiste il file di blocco "postmaster.pid" restituito.
Elise,

3

Ho avuto un problema simile quando provavo a usare postgresql con le rotaie. L'aggiornamento del mio Gemfile per utilizzare la nuova versione di Gem pg risolve questo problema per me. (gem pg versione 0.16.0 funziona). Nel Gemfile usare:

gem 'pg', '0.16.0'

quindi eseguire quanto segue per aggiornare la gemma

bundle install --without production
bundle update
bundle install

1
Ciò ha risolto il problema anche per me. Ero su 0.15.1 passando da Rails 4.0 beta e ora usando Ruby 2.0.0. Una volta aggiornato a pg 0.16.0 il problema è stato risolto.
Bratsche,

Risolto il problema per me su 4.1.0.beta1
Andreas,

3

Ho letto molti argomenti su questo errore e la soluzione per me era semplicemente riavviare i postgres con:

sudo service postgresql restart

Che non è menzionato qui.


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

Sto cercando la soluzione per un po '. Quindi, questo ha risolto il problema anche per me (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

Uso OS X 10.11.3 con brew.


2

Questo è successo a me oggi dopo che la batteria del mio Macbook è morta. Penso che questo possa essere causato da un arresto improprio. Tutto ciò che devi fare in casi come il mio è eliminare postmaster.pid

Passa alla cartella

cd /usr/local/var/postgres

Controlla se postmaster.pid è presente

ls

Rimuovi postmaster.pid

rm postmaster.pid

2

Nel mio caso nessuna delle soluzioni precedenti era buona. Invece di utilizzare socket, è possibile utilizzare il numero TCP host+ portnel file di configurazione di Rails. Quindi nel database.ymlfile basta aggiungere due righe come qui:

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

Questo ha risolto il mio problema :)

Prima di usare questa correzione:

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

Ma dopo ogni riavvio è /tmp/.s.PGSQL.5432stato eliminato e ho dovuto ripetere questi comandi. La soluzione funziona, ma è orribile, quindi è meglio modificare il file di configurazione del database Rails :)


2

Ho ricevuto questo errore quando stavo installando Posgtres con Django, sto usando Back Track e viene fornito con Postgres installato. Presumo che le impostazioni siano il problema. L'ho risolto rimuovendolo completamente e reinstallandolo in questo modo.

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

Ora esegui:

apt-get --purge remove postgresql\*

per rimuovere tutto PostgreSQL dal tuo sistema. La sola eliminazione del pacchetto Postgres non è sufficiente poiché è solo un meta-pacchetto vuoto.

Una volta rimossi tutti i pacchetti PostgreSQL, eseguire:

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

Ora dovresti essere in grado di:

apt-get install postgresql

1

MacOSX qui. Ho avuto lo stesso problema dopo aver aggiornato la mia installazione postresql da un pre-9.1 a 9.1.2 usando homebrew. (A proposito, ricordati di scaricare i database prima dell'aggiornamento con pg_dump, i database pre-9.1 sono incompatibili.) Stesso problema, stessi messaggi di errore.

Disinstallare la gemma PG ha fatto il trucco per me. In realtà ho dovuto ballare un po 'per scoprire il problema. Per prima cosa ho fatto una disinstallazione globale di gemme, cancellando il mazzo di tutte le vecchie gemme (ce n'erano alcune). Quindi ho rimosso pg dal mio Gemfile, ricondizionato, ripristinato il riferimento pg e rimbalzato ancora una volta.

Successivamente, ha funzionato come un fascino.


1

Ciao mondo :)
Il modo migliore ma strano per me era fare le prossime cose.

1) Scarica postgres93.app o altra versione. Aggiungi questa app nella cartella / Applicazioni /.

2) Aggiungi una riga (comando) nel file.bash_profile (che si trova nella mia home directory):

export PATH = / Applicazioni / Postgres93.app / Contenuti / MacOS / bin /: $ PATH
È un PERCORSO psqlda Postgres93.app. La riga (comando) viene eseguita ogni volta che viene avviata la console.

3) Avvia Postgres93.appdalla /Applications/cartella. Avvia un server locale (la porta è "5432" e l'host è "localhost").

4) Dopo tutte queste manipolazioni sono stato felice di eseguire $ createuser -SRDP user_namee altri comandi e vedere che ha funzionato! Postgres93.apppuò essere fatto funzionare ad ogni avvio del sistema.

5) Inoltre, se si desidera visualizzare graficamente i database, è necessario installarli PG Commander.app. È un buon modo di vedere il tuo DB postgres come tabelle dati piuttosto carine

Naturalmente, è utile solo per il server locale. Sarò felice se queste istruzioni aiuteranno gli altri che hanno affrontato questo problema.


0

Ho avuto questo problema che mi affligge e, dopo ulteriori indagini (in esecuzione rake db:setup), ho visto che le rotaie stavano cercando di connettersi a un'istanza di Postgres precedentemente utilizzata, una che era memorizzata nelle variabili env come DATABASE_URL.

La correzione: unset DATABASE_URL

fonte: https://stackoverflow.com/a/17420624/2577622


0

Ho provato la maggior parte delle soluzioni a questo problema, ma non sono riuscito a farlo funzionare.

Ho corso lsof -P | grep ':5432' | awk '{print $2}'che ha mostrato il PID del processo in esecuzione. Tuttavia non potrei ucciderlo con kill -9 <pid>.

Quando ho eseguito pkill postgresqlil processo finalmente si è fermato. Spero che questo ti aiuti.


0
gem uninstall pg

Su OS X con Homebrew:

gem install pg -- --with-pg-config=/usr/local/bin/pg_config
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.