PostgreSQL s'exécute localement mais je ne peux pas me connecter. Pourquoi?

32

J'ai récemment mis à jour ma machine de Mac OS X Lion (10.7.4) à Mountain Lion (10.8) et je pense que cela a bouleversé mon installation PostgreSQL. Il a été installé à l'origine via Homebrew. Je ne suis pas un administrateur de base de données, mais j'espère que quelqu'un pourra me dire comment résoudre ce problème.

Je ne parviens pas à me connecter (mais j'étais capable de le faire avant le Mountain Lion):

$ psql -U rails -d myapp_development
psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?

Mais Postgres fonctionne toujours clairement:

$ ps aux | grep postgres
meltemi          2010   0.0  0.0  2444124   5292   ??  Ss   Wed01PM   0:00.02 postgres: rails myapp_development [local] idle    
meltemi           562   0.0  0.0  2439312    592   ??  Ss   Wed12PM   0:02.28 postgres: stats collector process       
meltemi           561   0.0  0.0  2443228   1832   ??  Ss   Wed12PM   0:01.57 postgres: autovacuum launcher process       
meltemi           560   0.0  0.0  2443096    596   ??  Ss   Wed12PM   0:02.89 postgres: wal writer process       
meltemi           559   0.0  0.0  2443096   1072   ??  Ss   Wed12PM   0:04.01 postgres: writer process       
meltemi           466   0.0  0.0  2443096   3728   ??  S    Wed12PM   0:00.85 /usr/local/bin/postgres -D /usr/local/varpostgres -r /usr/local/var/postgres/server.log

Et il répond aux requêtes (à la fois une base de test et la base de développement) à partir d'une application Rails locale.

  User Load (0.2ms)  SELECT "users".* FROM "users" 
  Rendered users/index.html.haml within layouts/application (1.3ms)

Il semble n'y avoir aucun /var/pgsql_socket/répertoire, sans parler du /var/pgsql_socket/.s.PGSQL.5432fichier de socket mentionné ci-dessus!?! Peut-être que l'installation de Mountain Lion a effacé cela?

$ ls -l /var/ | grep pg
drwxr-x---   2 _postgres  _postgres    68 Jun 20 16:39 pgsql_socket_alt

Comment puis-je résoudre ce problème?

Meltemi
la source
Pas un administrateur postgres, mais un fichier de socket manquant semble à peu près correct. Créez le répertoire / var / pgsql_socket (avec votre utilisateur disposant des droits en écriture) et redémarrez le serveur. Voyez si cela résout le problème
Derek Downey
Question connexe sur SO . On dirait que Apple n'a pas fait un excellent travail avec la mise à niveau.
Erwin Brandstetter
est-il fait mention d'un fichier de socket en cours de création dans le fichier journal /usr/local/var/postgres/server.log?
Philᵀᴹ
@ErwinBrandstetter Comment pensez-vous qu'Apple fera un "bon travail" en mettant à niveau les applications tierces * installées manuellement?
Philᵀᴹ
@ Phil- aucune mention. Je commence à penser que cela pourrait être un problème de variable de chemin. Je pense mon$PATH quelqu'un l' a modifié la mise à niveau /usr/binest en avance sur /usr/local/binet je pense que Mountain Lion peut venir avec PostgreSQL pré-installé!?! Enquête sur ...
Meltemi le

Réponses:

30

J'ai trouvé que j'avais un problème extrêmement similaire, à savoir que postgres ouvrait un socket dans /var/pgsql_socket_altlequel aucun de mes logiciels ne s'attend à chercher, mais la solution à mon problème n'était pas seulement un problème avec mon $PATH.

Je devais créer le répertoire /var/pgsql_socket, le chown à moi-même et le placer unix_socket_directorydans postgresql.conf(situé dans /usr/local/var/postgres) dans ce répertoire, puis utiliser le pg_ctlbinaire in /usr/local/binpour démarrer avec succès le serveur postgres correct (ce qui est bien le cas ici $PATH- assurez-vous de which pg_ctlrésoudre le problème /usr/local/bin/pg_ctl, ou juste toujours appelez-le explicitement).

Cela pourrait aider les autres utilisateurs qui trouvent cette question via la /var/pgsql_socket_altmention.

Volonté
la source
Intéressant. Êtes-vous aussi sur Mountain Lion? Avez-vous installé PostgreSQL avec Homebrew? Si tel est le cas, demandez-vous si quelqu'un d'autre peut vérifier cette solution plutôt que de la modifier, $PATHcomme je l'ai fait.
Meltemi
Oui, oui, et j'espère bien!
Will
@wolftron, votre solution était géniale pour moi (Mountain Lion, homebrew / postgres, / var / pgsql_socket_alt, les neuf entiers). Est-ce un nouveau numéro sur Mountain Lion with homebrew? Je vais ouvrir un billet avec eux si vous le pensez.
On dirait que nous avons la vérification de @Jamie.
Will
Je peux confirmer ce problème et la solution sous OS X 10.8.2 / brasser l’installation de postgresql 9.2.1.
Hartwig
8

Une explication plausible et typique serait que le psql contenu de l’homebrew est /usr/local/bin/psqldifférent de celui qui se trouve dans votre $ PATH, comme /usr/bin/psql(fourni avec OS X). Vous voudrez peut-être essayer avec le chemin complet:

$ /usr/local/bin/psql -U rails -d myapp_development

En outre, il y a quelque chose d'assez inhabituel dans le psrésultat de votre question: le serveur postgres fonctionne sous un meltemiutilisateur Unix, alors postgresqu'en général, l' utilisateur Unix dédié est utilisé pour cela.

Daniel Vérité
la source
De plus, _postgres(avec trait de soulignement) pour l'utilisateur / le groupe m'est inconnu. Est-ce un artefact ou prévu?
Erwin Brandstetter
Oui, cela semble être un $PATHproblème, comme vous l'avez dit. Les choses fonctionnent comme avant lorsque j'utilise /usr/local/bin/psqlpour accéder à la base de données. Soit Lion n’avait pas de système PostgreSQL, soit mon $ PATH était configuré différemment. Cela fait un an que je suis embrouillé pour la dernière fois, donc je ne me souviens pas exactement. En ce qui concerne l'utilisateur Unix ... avec une installation Homebrew de PostgreSQL, le serveur est lancé par launchd et l'utilisateur est défini sur l'utilisateur local qui l'a installé, par défaut. Les choses sont configurées différemment sur Mac OS X Server, qui lance automatiquement PostgreSQL sous postgres.
Meltemi
4

Je ne connais aucun fichier de configuration pour le client psql. Cependant, psql respecte un certain nombre de variables d’environnement en corrélation avec les options de ligne de commande.

Donc, pour que le psql utilise automatiquement le socket de votre choix, vous pouvez définir la variable PGHOST sur le répertoire contenant le socket. c'est à dire

PGHOST=/var/pgsql_socket_alt
psql -d mydatabsase
Happynix
la source
1
Ce n'est pas documenté partout où je peux trouver que vous pouvez définir PGHOST dans le répertoire où résident les fichiers de socket. Mais cela fonctionne en fait. Merci!
Andrew Schulman
3

Essayer:

psql -U rails -d myapp_development -h localhost

ou

psql -U rails -d myapp_development -h 127.0.0.1
Miguel
la source
3

En retard, mais j'ai trouvé cela utile: http://tammersaleh.com/posts/installing-postgresql-for-rails-3-1-on-lion

C'était pour Lion, mais j'avais les mêmes problèmes que celui de ce fil après avoir passé de 10.6.8 à Mountain Lion et installé PostgreSQL via HomeBrew auparavant sous 10.6.8. J'ai également eu le /var/pgsql_socket_altdossier mystérieux après la mise à niveau, mais je l'ai simplement supprimé et créé /var/pgsql_socketcomme suggéré par @wolftron. Cependant, ce n'était pas la solution finale.

Si je laissais en unix_socket_directoryblanc / commentais postgresql.conf, tous les projets existants avant la mise à niveau se plaindraient de l' /var/pgsql_socketabsence du socket . Mais si je changeais de conf et de coder en dur var/pgsql_socket, tous les nouveaux projets se plaindraient que le socket /tmpétait manquant. Très frustrant ... jusqu'à ce que je réinstalle pg gemdans un projet pré-10.8 ( gem uninstall pg && gem install pg) et laisse de unix_socket_directorycommentaires dans le conffichier. Après un pg_ctlredémarrage rapide du serveur, les nouveaux et les anciens projets ont fonctionné. Ma socket pgsql habite/tmp maintenant, fwiw.

Note: si vous utilisez activerecord-postgresql-adaptergem, désinstallez-le d'abord, puis réinstallez pg, puis réinstallez-le activerecord-postgresql-adapter.

Pied
la source
2

Je viens juste de m'inscrire à la dba SE, alors il semble que je ne sois pas en mesure de commenter l'article (quel pot!).

Cependant, j'étais confiant que j'étais dans le même bateau que @thure. Je m'étais assuré que / usr / local / bin était plus tôt dans mon chemin que / usr / bin, il avait vérifié quels fichiers binaires le shell avait hachés whichettype , etc.

J'ai vu les mêmes symptômes que @thure. Puis j'ai eu une épiphanie; J'ai réalisé que j'avais reconstruit lepg gemme (j'utilise Ruby) dans un shell dont PATH avait été affecté de manière négative par path_helper de Mac (qui est exécuté à partir de / etc / profile et place / usr / bin avant / usr / local / bin) .

J'ai désinstallé pg et l'ai réinstallé dans un shell dont le chemin était correct. Tout à coup, je pouvais me connecter!

Donc, assurez-vous de recompiler les personnes qui lient votre langage et laissez-les trouver la copie correcte de (vraisemblablement) pg_config.

Graham Ashton
la source
1

J'ai trouvé que la création de liens symboliques entre l'emplacement réel et l'emplacement prévu fonctionnait parfaitement:

sudo ln -s /var/pgsql_socket_alt /var/pgsql_socket

dans le sens de la réponse acceptée par @thure mais plus simple.

Danny Roberts
la source
1

En 2016, El Capitan est là et Apple continue de changer les choses. Postgres est installé avec le système d'exploitation et le fichier de configuration postgres définit la propriété unix_socket_directories dans postgresql.conf sur / tmp. Le socket est dans /tmp/.s.PGSQL.5432. J'ai pu contourner le problème en exécutant ce qui suit:

sudo ln -s /tmp /var/pgsql_socket

J'espère que ça aide quelqu'un.

rudimentaire
la source
1

Cherchez le bon fichier de socket

find / -name .s.PGSQL.5432 -ls

À partir du résultat, récupérez le chemin d'accès au fichier et utilisez-le avec le paramètre "-h" dans la commande psql

Par exemple, voici comment je me connecte à la base de données de calendrier et de contacts macOS Server (au sein d'une session ssh sur le serveur):

sudo psql -U _calendar -h /private/var/run/caldavd/PostgresSocket/ -d caldav

Ensuite, le fichier de socket sur le chemin sera utilisé pour se connecter.

Olaf Seifert
la source
1

Par défaut, PostgreSQL semble essayer de se connecter via unix-domain-sockets. UNIX DOMAIN SOCKET

Cela m'est arrivé lorsque j'exécutais l'instance postgres sur docker. Vous devez voir quel type de connexion votre serveur accepte-t-il. Pour moi, c’était clairement TCP et non un socket de domaine unix.

L'ajout d'un indicateur d'acceptation de l'hôte a redirigé la connexion vers le chemin correct et corrigé le problème.

psql -U username -p port -h host

PS: Les sockets de domaine Unix fonctionnent au niveau du noyau et la connexion n’a pas besoin de passer par tout le jazz requis pour les connexions TCP. Ils sont assez rapides et efficaces lorsque vous souhaitez établir une connexion avec votre propre machine à partir d’un processus différent dans le cadre d’une communication interprocessus.

Sudip Bhandari
la source
0

Bonjour tout le monde :)
La meilleure façon, mais étrange pour moi était de faire les choses suivantes.

1) Téléchargez postgres93.app ou une autre version. Ajoutez cette application dans le dossier / Applications /.

2) Ajoutez une ligne (commande) dans le fichier .bash_profile(qui se trouve dans mon répertoire personnel):

export PATH = / Applications / Postgres93.app / Contenu / MacOS / bin /: $ PATH
Il est un chemin à psqlpartir Postgres93.app. La ligne (commande) s'exécute à chaque démarrage de la console.

3) Lancer à Postgres93.apppartir du /Applications/dossier. Il démarre un serveur local (le port est "5432" et l'hôte est "localhost").

4) Après toutes ces manipulations, j'étais heureux de lancer d' $ createuser -SRDP user_nameautres commandes et de voir que cela fonctionnait! Postgres93.apppeut être fait pour fonctionner à chaque démarrage de votre système.

5) Aussi, si vous voulez voir vos bases de données graphiquement, vous devez installerPG Commander.app . C'est un bon moyen de voir votre base de données postgres sous forme de jolies tables de données

Bien sûr, cela n’est utile que pour le serveur local. Je serai heureux si ces instructions aident les autres personnes confrontées à ce problème.

Crazzyaka
la source
0

J'ai eu cette même erreur d'essayer de s'exécuter psqlsur la ligne de commande. Il s'est avéré que ma solution était beaucoup plus simple. J'avais mal configuré le port d'écoute dans le fichier de configuration: /etc/postgresql/9.4/main/postgres.conf . J'avais changé le port du port = 5432 au port = 5433. Lorsque je l'ai reconverti en 5432, cela a fonctionné comme prévu.

Pour tester si vous avez fait quelque chose de similaire, vous pouvez exécuter. $ psql -p5433 Il existe un certain nombre d'options utiles comme celle-ci pour la commande psql que vous pouvez trouver ici: http://www.postgresql.org/docs/9.4/static/app-psql .html pour que vous puissiez tester votre propre configuration incorrecte. Bien sûr, vous pouvez simplement supprimer votre dernier jeu de modifications de configuration des fichiers * .conf, également, pour vérifier si elles sont la source de votre problème. Je pense que cela vaut certainement la peine de vérifier avant de vous en mêler avec les autorisations de fichiers et les propriétaires. (N'oubliez pas de/etc/init.d/postgresql restart )

Ce que je n'ai PAS pu trouver, c'est le fichier de configuration qui définit les valeurs par défaut de la commande psql CLI. Quelqu'un peut-il commenter avec cela, s'il vous plaît?

Pour moi, je reviens toujours à mon premier principe de programmation: "Je suis généralement la source de toute erreur donnée!"

Peut-être que nous sommes tous les robots
la source