186 votos

PostgreSQL: ¿Por qué psql no puede conectarse al servidor?

Escribí psql y obtuve esto:

psql: no se pudo conectar al servidor: No existe el archivo o directorio
    ¿El servidor se está ejecutando de forma local y acepta
    conexiones en el socket de dominio Unix "/var/run/postgresql/.s.PGSQL.5432"?

Usé sudo netstat -nlp | grep 5432 para ver el estado pero no mostró nada. Y busqué en línea, alguien me dijo que modificara pg_hba.conf pero no puedo locate este archivo. También intenté este comando sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432. No funcionó.

120voto

Haleemur Ali Puntos 12864

El error indica que la utilidad psql no puede encontrar el socket para conectarse al servidor de tu base de datos. O bien no tienes el servicio de la base de datos ejecutándose en segundo plano, o el socket está ubicado en otro lugar, o tal vez el archivo pg_hba.conf necesita ser corregido.

Paso 1: Verificar que la base de datos esté ejecutándose

El comando puede variar dependiendo de tu sistema operativo. Pero en la mayoría de los sistemas *ix, lo siguiente funcionaría, buscará postgres entre todos los procesos en ejecución

ps -ef | grep postgres

En mi sistema, mac osx, esto muestra

501   408     1   0  2Jul15 ??         0:21.63 /usr/local/opt/postgresql/bin/postgres -D /usr/local/var/postgres -r /usr/local/var/postgres/server.log

La última columna muestra el comando utilizado para iniciar el servidor, y las opciones.

Puedes ver todas las opciones disponibles para iniciar el servidor de postgres utilizando lo siguiente.

man postgres

A partir de ahí, verás que las opciones -D y -r son respectivamente el datadir y el logfilename.

Paso 2: Si el servicio de postgres está ejecutándose

Utiliza find para buscar la ubicación del socket, que debería estar en algún lugar en el /tmp

sudo find /tmp/ -name .s.PGSQL.5432

Si postgres está ejecutándose y aceptando conexiones de socket, lo anterior debería mostrarte la ubicación del socket. En mi máquina, resultó ser:

/tmp/.s.PGSQL.5432

Luego, intenta conectarte vía psql utilizando explícitamente la ubicación de este archivo, por ejemplo

psql -h /tmp/ dbname

Paso 3: Si el servicio está ejecutándose pero no ves un socket

Si no puedes encontrar el socket, pero ves que el servicio está ejecutándose, verifica que el archivo pg_hba.conf permita los sockets locales.

Navega hasta el datadir y deberías encontrar el archivo pg_hba.conf.

Por defecto, cerca del final del archivo deberías ver las siguientes líneas:

# "local" is for Unix domain socket connections only
local       all       all       trust

Si no lo ves, puedes modificar el archivo y reiniciar el servicio de postgres.

106voto

Noushad Puntos 1522

Si no hay error al iniciar el servicio de Postgres, sigue estos pasos

Paso 1: Ejecutar pg_lsclusters listará todos los clústeres de Postgres en ejecución en tu dispositivo

ej:

Ver Cluster Port Status Owner    Data directory               Log file
9.6 main    5432 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log

probablemente el estado estará abajo en tu caso. Si no, reinicia el servicio de PostgreSQL

Paso 2: Reinicia el pg_ctlcluster

#el formato es pg_ctlcluster   
sudo pg_ctlcluster 9.6 main start

#reiniciar el servicio de PostgreSQL
sudo service postgresql restart

Paso 3: El Paso 2 falló y arrojó un error

Si reiniciar pg_lsclusters no tuvo éxito, arrojará un error. Mi error fue(Puedes ver los errores en los registros /var/log/postgresql/postgresql-9.6-main.log)

FATAL: could not access private key file "/etc/ssl/private/ssl-cert-snakeoil.key": Permission denied
Try adding `postgres` user to the group `ssl-cert`

Paso 4: verifica la propiedad de postgres

Asegúrate de que postgres sea el propietario de /var/lib/postgresql/version_no/main ej: sudo chown postgres -R /var/lib/postgresql/9.6/main/

Paso 5: Verifica que el usuario postgres pertenezca al grupo de usuarios ssl-cert

Me sucedió a mí y resultó que eliminé erróneamente el usuario Postgres del grupo "ssl-cert". Ejecuta el siguiente código para corregir el problema del grupo de usuarios y para corregir los permisos

#restablecer el usuario al grupo con
sudo gpasswd -a postgres ssl-cert

# Corregir la propiedad y el modo
sudo chown root:ssl-cert  /etc/ssl/private/ssl-cert-snakeoil.key
sudo chmod 740 /etc/ssl/private/ssl-cert-snakeoil.key

# ahora postgresql se inicia! (y el comando de instalación ya no falla)
sudo service postgresql restart

64voto

Promise Preston Puntos 1502

Experimenté este problema al trabajar con PostgreSQL en Ubuntu 18.04.

Verifiqué el estado de mi PostgreSQL y me di cuenta de que estaba funcionando correctamente usando:

sudo systemctl status postgresql

También intenté reiniciar el servidor de PostgreSQL en la máquina usando:

sudo systemctl restart postgresql

pero el problema persistía:

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

Siguiendo la respuesta de Noushad hice lo siguiente:

Listar todos los clusters de Postgres que se están ejecutando en tu dispositivo:

pg_lsclusters

esto me dio esta salida en color rojo, mostrando que todos estaban parados y el estado también mostraba detenido:

Ver Cluster Port Status Owner    Data directory              Log file
10  main    5432 down   postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
11  main    5433 down   postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
12  main    5434 down   postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log

Reinicia el pg_ctlcluster para uno de los clusters del servidor. Para mí, reinicié PG 10:

sudo pg_ctlcluster 10 main start

Sin embargo, lanzó el siguiente error, y el mismo error ocurrió cuando intenté reiniciar otros clusters de PG:

El trabajo para el servicio postgresql@10-main.service falló porque el servicio no realizó los pasos requeridos por su configuración de unidad.
Consulte "systemctl status postgresql@10-main.service" y "journalctl -xe" para más detalles.

Verifica el registro de errores, en este caso el mío es PG 10:

sudo nano /var/log/postgresql/postgresql-10-main.log

Vi el siguiente error:

2020-09-29 02:27:06.445 WAT [25041] FATAL:  data directory "/var/lib/postgresql/10/main" has group or world access
2020-09-29 02:27:06.445 WAT [25041] DETAIL:  Permissions should be u=rwx (0700).
pg_ctl: could not start server
Examine the log output.

Esto se produjo porque hice cambios en los permisos de archivo para el directorio de datos de PostgreSQL.

Lo solucioné ejecutando el siguiente comando. Ejecuté el comando para los 3 clusters de PG en mi máquina:

sudo chmod -R 0700 /var/lib/postgresql/10/main
sudo chmod -R 0700 /var/lib/postgresql/11/main
sudo chmod -R 0700 /var/lib/postgresql/12/main

Luego reinicié cada uno de los clusters de PG:

sudo pg_ctlcluster 10 main start
sudo pg_ctlcluster 11 main start
sudo pg_ctlcluster 12 main start

Y finalmente verifiqué la salud de los clusters nuevamente:

pg_lsclusters

esta vez todo estaba bien de nuevo ya que el estado mostraba en línea:

Ver Cluster Port Status Owner    Data directory              Log file
10  main    5432 en línea postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
11  main    5433 en línea postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
12  main    5434 en línea postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log

Es todo.

Espero que esto ayude

48voto

Aloha Churchill Puntos 151

En mi caso, lo siguiente funcionó para iniciar postgres después de encontrarme con el error

sudo service postgresql start
sudo su - postgres
psql

33voto

Faith Nassiwa Puntos 301

Me he encontrado con un problema similar un par de veces. Normalmente solo hago una instalación fresca de PostgreSQL siguiendo este tutorial y eso resuelve el problema a expensas de perder datos.

Hoy estaba decidido a encontrar una solución real. Reiniciar PostgreSQL lo solucionó en ubuntu. sudo /etc/init.d/postgresql restart

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X