No se puede conectar a PostgreSQL local


124

He logrado descifrar mi entorno de desarrollo local.

Todas mis aplicaciones locales de Rails ahora están dando el error:

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

No tengo idea de qué causó esto.

Mientras buscaba una solución, actualicé todas las gemas incluidas, las gemas del sistema actualizadas, los MacPorts actualizados. Sin alegría.

Otros han informado de este problema al actualizar OSX Leopard a Lion, debido a la confusión sobre qué versión de Postgres debe usarse (es decir, la versión OSX o la versión MacPorts). He estado ejecutando Lion durante varios meses, por lo que parece extraño que esto ocurra ahora.

Soy reacio a perder el tiempo sin entender primero cuál es el problema. ¿Cómo puedo depurar esto metódicamente?

¿Cómo puedo determinar cuántas versiones de PostgreSQL hay en mi sistema, a cuál se accede y dónde se encuentra? ¿Cómo soluciono esto si se usa el PostgreSQL incorrecto?

Perdón por las preguntas novatas. ¡Todavía estoy aprendiendo cómo funciona esto! Gracias por cualquier puntero.

EDITAR

Algunas actualizaciones basadas en sugerencias y comentarios a continuación.

Traté de ejecutar pg_lsclustersque devolvió un command not founderror.

Luego intenté localizar mi archivo pg_hba.conf y encontré estos tres archivos de muestra:

/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

¿Entonces supongo que hay instaladas 3 versiones de PSQL? Macports, OSX predeterminado y ???.

Luego busqué el script de inicio de launchctl ps -ef | grep postgresque me devolvió

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

He publicado el contenido de postgresql84-server.wrapper en http://pastebin.com/Gj5TpP62 .

Traté de correr port load postgresql184-serverpero recibí un error Error: Port postgresql184-server not found.

Todavía estoy muy confundido sobre cómo solucionar esto, y aprecio cualquier puntero "para tontos".

¡Gracias!

EDIT2

Este problema comenzó después de que tuve algunos problemas con Daemondo. Mis aplicaciones locales de Rails se estaban bloqueando con un error de aplicación en la línea de "no se puede encontrar la joya daemondo". Luego revisé una serie de actualizaciones de paquetes, actualizaciones de gemas, actualizaciones de puertos y actualizaciones de preparación para tratar de encontrar el problema.

¿Podría este error ser un problema con Daemondo?


Tenga en cuenta que cuando su aplicación se conecta, se conecta a través del puerto tcp en lugar del socket de dominio unix. Por lo tanto, debe configurar postgres para aceptar conexiones de red, al menos desde localhost.
Paul Tomblin

¿Por qué crees eso? Obviamente, los controladores están intentando conectarse a través del zócalo Unix. Aunque buscan el enchufe en el lugar equivocado.
Milen A. Radev


Exactamente. Parece ser una cosa de mac. OP podría usar la bandera -h, después de verificar que el postmaster se está ejecutando.
wildplasser

Por favor, publique el resultado pg_lsclustersy su pg_hba.confarchivo.
tscho

Respuestas:


66

Esto realmente parece un error de permisos de archivo. Los sockets de dominio Unix son archivos y tienen permisos de usuario como cualquier otro. Parece que el usuario de OSX que intenta acceder a la base de datos no tiene permisos de archivo para acceder al archivo socket. Para confirmar esto, he realizado algunas pruebas en Ubuntu y psql para intentar generar el mismo error (incluido a continuación).

Debe verificar los permisos en el archivo socket y sus directorios /vary /var/pgsql_socket. Su aplicación Rails (usuario de OSX) debe tener permisos de ejecución (x) en estos directorios (preferiblemente otorgue permisos a todos) y el socket debe tener permisos completos (wrx). Puede usar ls -lAd <file>para verificar estos, y si alguno de ellos es un enlace simbólico, debe verificar el archivo o dir al que apunta el enlace.

Puede cambiar los permisos en el directorio para usted, pero postgres configura el socket postgresql.conf. Esto se puede encontrar en el mismo directorio que pg_hba.conf(tendrá que averiguar cuál). Una vez que haya establecido los permisos, deberá reiniciar 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.

EDITAR:

Hice una búsqueda rápida en Google que quizás desee consultar para ver si es relevante. Esto bien podría resultar en cualquier intento de que findsu archivo de configuración falle.

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


Error de mensajes:

Usuario no encontrado en pg_hba.conf

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

El usuario falló la autenticación de contraseña:

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

Falta un archivo de socket 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"?

El socket Unix existe, pero el servidor no lo escucha.

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

Permisos de archivos incorrectos en el archivo de 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
gracias por estas ideas @couling. Esto se siente como la dirección correcta. Pero hay algo muy extraño con mi configuración. Tenga en cuenta que esto ha estado funcionando perfectamente hasta hace poco. He revisado los tres directorios de postgres en mi sistema, todos contienen archivos conf.sample (pg_hba, pg_ident, pg_service, etc.) pero no archivos .conf. Este no debería ser el caso, ¿correcto? Además, el directorio que debe contener .s.PGSQL.5432 está vacío. En cambio, tengo un archivo ubicado en /private/tmp/.s.PGSQL.5432.lock. PSdevuelve procesos postgres para que se esté ejecutando. ¡Confuso!
Andy Harvey

He añadido un enlace extra. Hasta donde yo sé, realmente no puedes tener postgresql sin postgresql.conf (incluso si ha sido renombrado). Su primera tarea debe ser encontrar esto.
Philip Couling

1
ha tomado algún tiempo rastrear a través de mis directorios y encontrar los archivos correctos, pero este fue realmente el problema. Gracias por la respuesta muy detallada. Una vez que encontré el directorio correcto, tuve que configurar el directorio de socket, el directorio de datos, hba_file e ident_file en postgresql.conf. ¡Gracias!
Andy Harvey

1
Podría ayudar a algunas personas: solía preparar cerveza para instalar postgres en mi cuenta. En mi caso, resultó que la carpeta / var / pgsql_socket / era propiedad del usuario _postgres y cambiar la propiedad de mi cuenta (darren) solucionó este problema. No estoy seguro de por qué brew no estableció la propiedad de esta carpeta correctamente en primer lugar ...?
Darren Jensen

Gracias amables. No pude conectarme y configurar el directorio unix_socket_directory fue lo correcto.
Ryan Bigg

41

Mi intuición es que esto es (nuevamente) una cosa mac / OSX: el front-end y el back-end asumen una ubicación diferente para el socket de dominio unix (que funciona como un punto de encuentro ).

Lista de Verificación:

  • Postgres se está ejecutando: ps aux | grep postgres | grep -v grepdebería hacer el truco
  • Dónde se encuentra el zócalo: find / -name .s.PGSQL.5432 -ls(el zócalo solía estar en / tmp; podría comenzar a buscar allí)
  • incluso si localiza el socket (dominio unix), el cliente podría usar una ubicación diferente. (esto sucede si combina distribuciones, o si tiene una distribución instalada en algún lugar y tiene otra instalación (por ejemplo, de origen) en otro lugar), con el cliente y el servidor utilizando diferentes direcciones de cita .

Si postgres se está ejecutando y el socket realmente existe, puede usar:

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

(que intenta conectarse al socket de dominio unix)

; ahora debería obtener el indicador psql: intente \dy luego \qsalga. También puedes probar:

  • psql -h localhost mydbname.

(que intenta conectarse a localhost (127.0.0.1)

Si estos intentos fallan debido a una autorización insuficiente, puede alterar pg_hba.conf (y SIGHUP o reiniciar) En este caso: también verifique los registros.

Una pregunta similar: no se puede iniciar Postgres

Nota: Si puede acceder al indicador psql, la solución rápida a este problema es simplemente cambiar su config/database.yml, agregue:

host: localhost

o podrías intentar agregar:

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

En mi caso, host: /tmp


1
@wildplasser gracias por tu respuesta. Esto me ayudó a comenzar en la dirección correcta, y la respuesta detallada de Couling dio la solución.
Andy Harvey

66
Agregar el host: localhost a mi base de datos.yml solucionó mi problema. Gracias :)
Automatico

1
el mío está en / privado / ... rareza. Lo instalé, pero esta computadora portátil también tenía problemas anteriormente. Extraño. esa base de datos.yml fue clave!
pjammer

44
Extraño. Agregar "localhost" a mi base de datos.yml también funcionó, pero ¿por qué? No tenía eso antes y todo funcionaba bien. Pero no creo que haya agregado nada tarde y de repente ya era así. > _ <
índice

1
El truco para mí aquí fue la ruta del socket: estaba en / run not / var / run, ¡gracias!
qodeninja

26

Intente desinstalar el pg gem ( gem uninstall pg) y luego reinstalar; si usa bundler, entonces bundle install, de lo contrariogem install pg . Además, asegúrese de que la ruta elija la versión correcta: Lion tiene una versión de posgresql (las versiones anteriores no) y puede estar en la ruta antes de su versión instalada localmente (por ejemplo, MacPorts, homebrew).

En mi caso: instalación homebrew de postgresql, postgresql actualizado, rails, etc. y luego recibí este error. Desinstalar y reinstalar la gema pg lo hizo por mí.


8
paquete de gema ejecutiva prístina pg <== también hará el truco
Ben Walding

No tengo dudas de que el error del OP puede ser causado por varias cosas, pero esta es la solución que funcionó para mí.
redhotvengeance

20

La ubicación del archivo de socket se cuece en la gema en tiempo de compilación. Por lo tanto, necesita reconstruir su gema pg.

gem pristine pg
# or
bundle exec gem pristine pg

Esto debería resolver ese problema en particular.


Empecé a tener el problema descrito en esta pregunta después de actualizar Breve Postgres de 9.1x a 9.3x. Esta respuesta me lo arregló (al igual que agregar 'localhost' a mi base de datos.yml, pero me gusta más este enfoque).
Joshua Flanagan

16

Si obtiene un error similar:

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

Esto podría hacer el truco (lo hizo para mí):

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

El directorio especificado debe ser diferente si no está utilizando OSX / Brew.

Nota: Este no es el mensaje de error exacto visto anteriormente, pero este hilo es el primer resultado para ese mensaje de error.


66
Siempre termino teniendo este problema de vez en cuando, pero esta es la primera vez que lo resuelvo con ESTA solución. Además, tenía que hacerlo rm -fr /usr/local/var/postgresantes de correrinitb
Raf

1
Después de hacer esto (tanto de Neal como de Raf), obtuve un error de la base de datos "Fatal". Entonces ejecuté "rake db: create: all" y "rake db: migrate" y finalmente todo volvió a funcionar.
Deborah

También tuve que hacer rm -rf /usr/local/var/postgresentonces initdb /usr/local/var/postgres -E utf8. Pero asegúrese de que postgres no se esté ejecutando cuando haga esto; de lo contrario, el directorio se volverá a crear casi de inmediato.
Josh W Lewis

8

lo que resolvió este error para mí fue eliminar un archivo llamado postmaster.pid en el directorio postgres. consulte mi pregunta / respuesta utilizando el siguiente enlace para obtener instrucciones paso a paso. mi problema no estaba relacionado con los permisos de archivo:

psql: no se pudo conectar al servidor: no existe tal archivo o directorio (Mac OS X)

Sin embargo, las personas que respondieron a esta pregunta dejaron mucho juego, ¡gracias por eso! voté todo lo que pude


Dado que la respuesta aceptada aquí señala un problema de permisos de archivos, parece evidente que su publicación y esta no están relacionadas.
Andrew Barber

7

Así es como resolví ese mensaje de error, basado en parte en la respuesta de wildplasser.

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

Entonces, está mi socket o lo que sea, pero el cliente lo busca en:

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

Entonces, simplemente haga un enlace simbólico a /tmp/.s.PGSQL.5432:

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

Espero que esto ayude a cualquiera. Parece un poco mal, pero bueno, ¡funciona!


1
Esto funcionó para mí: sudo ln -s /tmp/.s.PGSQL.5432 /var/pgsql_socket/.s.PGSQL.5432
ardochhigh

Gracias :) Esto ayudó. Pero antes de hacer un enlace simbólico, no olvide crear una sudo mkdir /var/run/postgresqlcarpeta (en mi caso, la identificación no existía y el instalador no la creó para la página 9.3.X).
kovpack

2
Oh, esta solución resultó ser una solución 'única' que tuve que rehacer después de cada reinicio. Para Rails, he encontrado otra solución: modificar el archivo de configuración de la base de datos (respuesta agregada a continuación).
kovpack

6

Comencé a recibir esto después de actualizar a un nuevo postgres; no me di cuenta de que tenía archivos de datos retenidos.

Primero intenté iniciar el servidor postgres:

postgres -D /usr/local/var/postgres

que es como vi este error

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.

Entonces encontré esta respuesta en SO, relacionada con un error de incompatibilidad: /server/342626/how-do-i-upgrade-postgresl-database-incompatibility-error

Esto es lo que lo arregló

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

4

Solo confirmando que tuve un problema similar en PSQL y Django,

Parecía porque mi servidor psql no se cerró correctamente y el archivo postmaster.pid todavía estaba presente (debería eliminarse en el apagado correcto automáticamente) en mi carpeta de postgres.

Borrado esto y todo bien


2
Esto es lo que resolvió el problema para mí. Mi computadora se congeló y tuve que apagarla por completo. Cuando lo volví a poner en marcha, Postgres decía que psql: could not connect to server: No such file or directory.Eliminar postmaster.pidde /usr/local/var/postgreshizo que todo volviera a funcionar.
Ryan Epp

1
Esto también fue lo que me pasó. Mi mac se reinició debido a un kernel panic y tuve que eliminar postmaster.pid antes de volver al trabajo.
Ben

4

Estaba recibiendo este mismo error (resulta que fue un error postmaster.pid. Así es como conseguí que Postgres volviera a funcionar ( crédito a Ricardo Burillo por la solución ):

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

Esto funcionó para mí, aunque el pg_resetxlogarchivo de bloqueo devuelto "postmaster.pid" existe.
Elise

3

Tuve un problema similar al intentar usar postgresql con rieles. Actualizar mi Gemfile para usar una nueva versión de gem pg solucionó este problema por mí. (Gema pg versión 0.16.0 funciona). En el uso de Gemfile:

gem 'pg', '0.16.0'

luego ejecuta lo siguiente para actualizar la gema

bundle install --without production
bundle update
bundle install

1
Esto solucionó el problema para mí también. Estaba en 0.15.1 pasando por la versión beta de Rails 4.0 y ahora usando Ruby 2.0.0. Una vez que actualicé a la página 0.16.0, se solucionó el problema.
bratsche

Resolvió el problema para mí en 4.1.0.beta1
Andreas

3

Leí muchos temas sobre este error y la solución para mí fue simplemente reiniciar los postgres con:

sudo service postgresql restart

Lo cual no se menciona aquí.


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

Estoy buscando la solución por un tiempo. Entonces, este también solucionó el problema para mí (reiniciar db):

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

Yo uso OS X 10.11.3 con brew.


2

Esto me sucedió hoy después de que se agotó la batería de mi Macbook. Creo que esto puede ser causado por un apagado incorrecto. Todo lo que tienes que hacer en casos como el mío es eliminar postmaster.pid

Navega a la carpeta

cd /usr/local/var/postgres

Verifique si postmaster.pid está presente

ls

Eliminar postmaster.pid

rm postmaster.pid

2

En mi caso, ninguna de las soluciones anteriores era buena. En lugar de usar socket, puede usar el número TCP host+ porten el archivo de configuración de Rails. Entonces, en el database.ymlarchivo, solo agregue dos líneas como aquí:

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

Esto resolvió mi problema :)

Antes de usar esta solución:

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

Pero después de cada reinicio /tmp/.s.PGSQL.5432se eliminó y tuve que repetir estos comandos. La solución funciona, pero es horrible, así que mejor simplemente modifique el archivo de configuración de la base de datos Rails :)


2

Recibí este error cuando estaba configurando Posgtres con Django, estoy usando Back Track y viene con Postgres instalado. Supongo que la configuración es el problema. Lo arreglé quitándolo por completo y luego reinstalando así.

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

Ahora ejecuta:

apt-get --purge remove postgresql\*

para eliminar todo PostgreSQL de su sistema. Simplemente purgar el paquete postgres no es suficiente ya que es solo un metapaquete vacío.

Una vez que se hayan eliminado todos los paquetes de PostgreSQL, ejecute:

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

Ahora debería poder:

apt-get install postgresql

1

MacOSX aquí. Tuve el mismo problema después de actualizar mi instalación postresql de una versión anterior a 9.1 a 9.1.2 usando homebrew. (Por cierto, recuerde volcar las bases de datos antes de su actualización con pg_dump, las bases de datos anteriores a la 9.1 son incompatibles). Mismo problema, mismos mensajes de error.

Desinstalar la gema PG me ayudó. De hecho, tuve que bailar un poco para descubrir el problema. Primero hice una desinstalación global de gemas, limpiando la cubierta de todas las gemas antiguas (había algunas). Luego eliminé pg de mi Gemfile, volví a agrupar, restauré la referencia de pg y recuperé una vez más.

Después de eso, funcionó a las mil maravillas.


1

Hola mundo :)
La mejor pero extraña forma para mí era hacer lo siguiente.

1) Descargue postgres93.app u otra versión. Agregue esta aplicación a la carpeta / Aplicaciones /.

2) Agregue una fila (comando) en el archivo .bash_profile(que está en mi directorio de inicio):

export PATH = / Applications / Postgres93.app / Contents / MacOS / bin /: $ PATH
Es un CAMINO a psqlpartir de Postgres93.app. La fila (comando) se ejecuta cada vez que se inicia la consola.

3) Ejecutar Postgres93.appdesde la /Applications/carpeta. Inicia un servidor local (el puerto es "5432" y el host es "localhost").

4) ¡ Después de todas estas manipulaciones me alegré de ejecutar $ createuser -SRDP user_namey otros comandos y ver que funcionó! Postgres93.apppuede ejecutarse cada vez que se inicia su sistema.

5) Además, si desea ver sus bases de datos gráficamente, debe instalarPG Commander.app . Es una buena manera de ver su base de datos postgres como bonitas tablas de datos

Por supuesto, es útil solo para el servidor local. Me alegrará si estas instrucciones ayudan a otros que se han enfrentado a este problema.


0

Tuve este problema que me atormentaba, y después de una investigación adicional (en ejecución rake db:setup), vi que rails intentaba conectarse a una instancia de postgres utilizada anteriormente, una que estaba almacenada en variables env como DATABASE_URL.

La solución: unset DATABASE_URL

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


0

Intenté la mayoría de las soluciones a este problema, pero no pude conseguir ninguna.

Ejecuté lo lsof -P | grep ':5432' | awk '{print $2}'que mostró el PID del proceso en ejecución. Sin embargo no pude matarlo con kill -9 <pid>.

Cuando ejecuté pkill postgresqlel proceso finalmente se detuvo. Espero que esto ayude.


0
gem uninstall pg

En OS X con Homebrew:

gem install pg -- --with-pg-config=/usr/local/bin/pg_config
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.