PostgreSQL wird lokal ausgeführt, aber ich kann keine Verbindung herstellen. Warum?


32

Kürzlich wurde mein Computer von Mac OS X Lion (10.7.4) auf Mountain Lion (10.8) aktualisiert, und ich denke, es hat meine PostgreSQL-Installation beschädigt. Es wurde ursprünglich über Homebrew installiert. Ich bin kein DBA, aber ich hoffe, jemand kann mir sagen, wie ich das beheben kann.

Ich konnte keine Verbindung herstellen (konnte es aber vor dem 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"?

Aber Postgres läuft immer noch klar:

$ 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

Und es reagiert auf Anfragen (sowohl auf eine Test-Datenbank als auch auf die Entwicklungs-Datenbank) von einer lokalen Rails-App

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

Es scheint kein /var/pgsql_socket/Verzeichnis zu geben, geschweige denn die /var/pgsql_socket/.s.PGSQL.5432oben erwähnte Socket-Datei!?! Vielleicht hat die Installation von Mountain Lion das ausgelöscht?

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

Wie kann ich das beheben?


Kein Postgres-Administrator, aber eine fehlende Socket-Datei klingt ungefähr richtig. Erstellen Sie das Verzeichnis / var / pgsql_socket (mit Ihren Schreibrechten) und starten Sie den Server neu. Sehen Sie, ob dies das Problem behebt
Derek Downey

Verwandte Frage zu SO . Scheint, als hätte Apple mit dem Upgrade keine großartige Arbeit geleistet.
Erwin Brandstetter

Erwähnt man, dass in der Protokolldatei eine Socket-Datei erstellt wird /usr/local/var/postgres/server.log?
Philᵀᴹ

@ErwinBrandstetter Wie können Sie erwarten, dass Apple manuell installierte * nix-Apps von Drittanbietern "gut" aufrüstet?
Philᵀᴹ

@ Phil- keine Erwähnung. Ich fange an zu glauben, dass dies ein Problem mit Pfadvariablen sein könnte. Ich denke, dass meine $PATHÄnderungen mit dem Upgrade /usr/binvor uns liegen /usr/local/binund ich denke, dass Mountain Lion mit vorinstalliertem PostgreSQL geliefert werden kann!?! Untersuchung ...
Meltemi

Antworten:


30

Ich stellte fest, dass ich ein äußerst ähnliches Problem hatte, nämlich, dass postgres einen Socket öffnete, in /var/pgsql_socket_altdem keine meiner Software das Aussehen erwartet, aber die Lösung meines Problems war nicht nur ein Problem mit meinem $PATH.

Ich hatte das Verzeichnis zu erstellen /var/pgsql_socket, ist es mir chown und Satz unix_socket_directoryin postgresql.conf(in /usr/local/var/postgres) in das Verzeichnis, dann die Verwendung pg_ctlbinär in /usr/local/bindem richtigen Postgres - Server erfolgreich gestartet werden (das ist , wo $PATHkommt - stellen Sie sicher , which pg_ctlEntschlüsse zu /usr/local/bin/pg_ctl, oder einfach nur immer nennen Sie es explizit).

Dies könnte anderen Benutzern helfen, die diese Frage über die /var/pgsql_socket_altErwähnung finden.


Interessant. Bist du auch auf Mountain Lion? Haben Sie PostgreSQL mit Homebrew installiert? Wenn ja, fragen Sie sich, ob jemand diese Lösung verifizieren kann, anstatt meine zu ändern, $PATHwie ich es getan habe.
Meltemi

Ja, ja, und ich hoffe es!
Wird

@wolftron Ihre Lösung war für mich ein Knaller (Mountain Lion, Homebrew / postgres, / var / pgsql_socket_alt, die ganzen neun). Ist dies eine neue Ausgabe von Mountain Lion mit Homebrew? Ich werde mit ihnen ein Ticket eröffnen, wenn Sie so denken.

Sieht so aus, als hätten wir eine Bestätigung von @Jamie.
Will

Ich kann dieses Problem und die Lösung unter OS X 10.8.2 / brew-Installation von postgresql 9.2.1 bestätigen.
Hartwig

8

Eine plausible und typische Erklärung wäre, dass das psql, was mit Homebrew geliefert wird /usr/local/bin/psql, sich von dem unterscheidet, das in Ihrem $ PATH vorkommt /usr/bin/psql(im Lieferumfang von OS X enthalten). Vielleicht möchten Sie es mit dem vollständigen Pfad versuchen:

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

Außerdem enthält die psAusgabe Ihrer Frage etwas ziemlich Ungewöhnliches : Der postgres-Server wird unter einem meltemiUnix-Benutzer ausgeführt, wobei im Allgemeinen der dedizierte postgresUnix-Benutzer dafür verwendet wird.


Auch _postgres(mit Unterstrich) für Benutzer / Gruppe sind mir unbekannt. Ist das ein Artefakt oder erwartet?
Erwin Brandstetter

Ja, es scheint ein $PATHProblem zu sein, wie Sie angegeben haben. Die Dinge funktionieren wie zuvor, wenn ich /usr/local/bin/psqlauf die Datenbank zugreife. Entweder hatte Lion kein PostgreSQL-System oder mein $ PATH wurde anders eingerichtet. Es ist ein Jahr her, seit ich das letzte Mal damit durcheinander war, also kann ich mich nicht genau erinnern. Was den Unix-Benutzer betrifft ... Bei einer Homebrew-Installation von PostgreSQL wird der Server von launchd gestartet, und der Benutzer wird standardmäßig auf den lokalen Benutzer eingestellt, der ihn installiert hat. Unter Mac OS X Server, unter dem PostgreSQL automatisch gestartet wird, sieht die Einrichtung anders aus postgres.
Meltemi

4

Ich kenne keine Konfigurationsdatei für den psql-Client. Psql berücksichtigt jedoch eine Reihe von Umgebungsvariablen, die mit Befehlszeilenoptionen korrelieren.

Damit psql automatisch den Socket Ihrer Wahl verwendet, können Sie die Variable PGHOST auf das Verzeichnis setzen, das den Socket enthält. dh

PGHOST=/var/pgsql_socket_alt
psql -d mydatabsase

1
Es ist nirgendwo dokumentiert, dass Sie PGHOST auf das Verzeichnis setzen können, in dem sich die Socket-Dateien befinden. Aber das funktioniert tatsächlich. Vielen Dank!
Andrew Schulman

3

Versuchen:

psql -U rails -d myapp_development -h localhost

oder

psql -U rails -d myapp_development -h 127.0.0.1

3

Spät, aber ich fand das hilfreich: http://tammersaleh.com/posts/installing-postgresql-for-rails-3-1-on-lion

Das war für Lion, aber ich hatte die gleichen Probleme wie in diesem Thread, nachdem ich von 10.6.8 auf Mountain Lion aktualisiert und PostgreSQL zuvor über HomeBrew installiert hatte, während ich auf 10.6.8 war. Ich hatte auch den mysteriösen /var/pgsql_socket_altOrdner nach dem Upgrade, aber ich habe ihn gerade entfernt und /var/pgsql_socketwie von @wolftron vorgeschlagen erstellt. Dies war jedoch nicht die endgültige Lösung.

Wenn ich unix_socket_directoryleer gelassen / in auskommentiert habe postgresql.conf, würden alle Projekte, die vor dem Upgrade vorhanden waren, beanstanden, dass das Socket-In /var/pgsql_socketfehlte. Aber wenn ich conf und hard-coded ändern würde var/pgsql_socket, würden sich alle neuen Projekte darüber beschweren, dass der Socket in /tmpfehlt. Sehr frustrierend ... bis ich pg gemin einem Projekt vor 10.8 ( gem uninstall pg && gem install pg) neu installiert und unix_socket_directoryin der confDatei auskommentiert habe. Nach einem schnellen pg_ctlNeustart des Servers funktionierten sowohl neue als auch alte Projekte. Meine Pgsql-Buchse lebt /tmpjetzt, fwiw.

Nebenbemerkung: Wenn Sie activerecord-postgresql-adaptergem verwenden, deinstallieren Sie es zuerst, installieren Sie pg erneut und installieren Sie es dann activerecord-postgresql-adaptererneut.


2

Ich habe mich gerade erst bei der dba SE angemeldet, kann also anscheinend keinen Kommentar zum entsprechenden Beitrag abgeben (was für ein Blödsinn!).

Ich war jedoch zuversichtlich, dass ich mich im selben Boot wie @thure befand. Ich hatte sichergestellt, dass / usr / local / bin früher in meinem PATH war als / usr / bin, und überprüft, mit welchen Binärdateien die Shell gehasht hat, whichund so weiter type.

Ich sah die gleichen Symptome wie @thure. Dann hatte ich eine Offenbarung; Ich erkannte, dass ich den pgEdelstein (ich verwende Ruby) in einer Shell neu erstellt hatte, deren PATH durch den path_helper von Mac beeinträchtigt wurde (der von / etc / profile ausgeführt wird und / usr / bin vor / usr / local / bin setzt). .

Ich habe pg deinstalliert und es in einer Shell neu installiert, deren PATH korrekt war. Plötzlich konnte ich mich verbinden!

Stellen Sie also sicher, dass Sie Ihre Sprachbindungen neu kompilieren, und lassen Sie sie die richtige Kopie von (vermutlich) finden pg_config.



1

Ich fand, dass das Verknüpfen des tatsächlichen Standorts mit dem erwarteten Standort gut funktioniert:

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

In Anlehnung an die akzeptierte Antwort von @thure, aber einfacher.


1

Hier ist es, 2016, El Capitan ist da draußen und Apple ändert ständig die Dinge. Postgres wird als Teil des Betriebssystems installiert und die Konfigurationsdatei postgres legt die Eigenschaft unix_socket_directories in postgresql.conf auf / tmp fest. Der Socket befindet sich in /tmp/.s.PGSQL.5432. Ich konnte das Problem umgehen, indem ich Folgendes ausführte:

sudo ln -s /tmp /var/pgsql_socket

Hoffe das hilft jemandem.


1

Suchen Sie nach der richtigen Socket-Datei

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

Rufen Sie aus dem Ergebnis den Pfad zur Datei ab und verwenden Sie den Pfad mit dem Parameter "-h" im Befehl psql

So verbinde ich mich beispielsweise mit der Kalender- und Kontaktdatenbank von macOS Server (innerhalb einer SSH-Sitzung mit dem Server):

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

Dann würde die Socket-Datei am Pfad verwendet, um eine Verbindung herzustellen.


1

Standardmäßig versucht postgres, eine Verbindung über Unix-Domain-Sockets herzustellen. UNIX-DOMAIN-BUCHSE

Dies passierte mir, als ich eine Postgres-Instanz auf Docker ausführte. Sie müssen sehen, welche Art von Verbindung Ihr Server akzeptiert. Für mich war es eindeutig TCP und kein Unix-Domain-Socket.

Durch das Hinzufügen eines Flags zum Akzeptieren des Hosts wurde die Verbindung zum korrekten Pfad umgeleitet und das Problem behoben.

psql -U username -p port -h host

PS: Unix-Domain-Sockets funktionieren auf Kernel-Ebene und die Verbindung muss nicht den gesamten Jazz durchlaufen, der für TCP-Verbindungen erforderlich ist. Sie sind recht schnell und effizient, wenn Sie im Rahmen der Interprozesskommunikation eine Verbindung zu Ihrem eigenen Computer von einem anderen Prozess aus herstellen möchten.


0

Hallo Welt :)
Der beste, aber seltsame Weg für mich war, die nächsten Dinge zu tun.

1) Laden Sie postgres93.app oder eine andere Version herunter . Fügen Sie diese App in den Ordner / Programme / hinzu.

2) Fügen Sie der Datei eine Zeile (Befehl) hinzu.bash_profile (die sich in meinem Ausgangsverzeichnis befindet):

export PATH = / Programme / Postgres93.app / Inhalt / MacOS / bin /: $ PATH
Es ist ein Weg psqlvon Postgres93.app. Die Zeile (Befehl) wird bei jedem Start der Konsole ausgeführt.

3) Starten Sie Postgres93.appaus dem /Applications/Ordner. Es startet einen lokalen Server (Port ist "5432" und Host ist "localhost").

4) Nach all diesen Manipulationen war ich froh, $ createuser -SRDP user_nameBefehle auszuführen und zu sehen, dass es funktionierte! Postgres93.appkann jedes Mal ausgeführt werden, wenn Ihr System gestartet wird.

5) Auch wenn Sie Ihre Datenbanken grafisch anzeigen möchten, sollten Sie installieren PG Commander.app. Es ist eine gute Möglichkeit, Ihre Postgres-Datenbank als hübsche Datentabellen zu sehen

Natürlich ist es nur für lokale Server hilfreich. Ich freue mich, wenn diese Anleitung anderen hilft, die sich mit diesem Problem befasst haben.



0

Ich habe den gleichen Fehler beim Versuch, psqlüber die Befehlszeile auszuführen . Es stellte sich heraus, dass meine Lösung viel einfacher war. Ich hatte den Listening-Port in der Konfigurationsdatei falsch konfiguriert: /etc/postgresql/9.4/main/postgres.conf . Ich hatte den Port von Port = 5432 in Port = 5433 geändert. Als ich ihn wieder in 5432 änderte, funktionierte er wie erwartet.

Um zu testen, ob Sie etwas Ähnliches getan haben, können Sie Folgendes ausführen: $ psql -p5433 Es gibt eine Reihe nützlicher Optionen für den Befehl psql, die Sie hier finden: http://www.postgresql.org/docs/9.4/static/app-psql .html, damit Sie Ihre EIGENE bestimmte Fehlkonfiguration testen können. Natürlich können Sie auch einfach Ihre letzten Konfigurationsänderungen aus den * .conf-Dateien entfernen, um zu testen, ob diese die Ursache für Ihr Problem sind. Ich denke, es ist auf jeden Fall einen Blick wert, bevor Sie sich mit Dateiberechtigungen und Eigentumsrechten beschäftigen. (Vergiss nur nicht /etc/init.d/postgresql restart)

Was ich nicht finden konnte, war die Konfigurationsdatei, die die Standardwerte für den Befehl psql CLI festlegt. Kann das bitte jemand kommentieren?

Für mich kehre ich immer zu meinem ersten Prinzip der Programmierung zurück: "Ich bin normalerweise die Quelle eines gegebenen Fehlers!"

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.