Es kann keine Verbindung zu postgresql über Port 5432 hergestellt werden

82

Ich habe den Bitnami Django-Stack installiert, der PostgreSQL 8.4 enthielt.

Beim Ausführen psql -U postgreserhalte ich folgende Fehlermeldung:

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

PG läuft definitiv und die pg_hba.confDatei sieht so aus:

# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

Was gibt?

"Beweis", dass pg läuft:

root@assaf-desktop:/home/assaf# ps axf | grep postgres
14338 ?        S      0:00 /opt/djangostack-1.3-0/postgresql/bin/postgres -D /opt/djangostack-1.3-0/postgresql/data -p 5432
14347 ?        Ss     0:00  \_ postgres: writer process                                                                        
14348 ?        Ss     0:00  \_ postgres: wal writer process                                                                    
14349 ?        Ss     0:00  \_ postgres: autovacuum launcher process                                                           
14350 ?        Ss     0:00  \_ postgres: stats collector process                                                               
15139 pts/1    S+     0:00              \_ grep --color=auto postgres
root@assaf-desktop:/home/assaf# netstat -nltp | grep 5432
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      14338/postgres  
tcp6       0      0 ::1:5432                :::*                    LISTEN      14338/postgres  
root@assaf-desktop:/home/assaf# 
Assaf Lavie
quelle
Ich habe keine Ahnung, wonach Sie fragen, und Sie haben nie Beiträge geliefert. Dies sind 100 Personen, die einen allgemeinen Fehler erhalten und verschiedene Dinge melden. Es ist für die Site völlig unformatiert.
Evan Carroll

Antworten:

87

Dieses Problem tritt bei der Installation des postgresPakets ohne Versionsnummer auf. Obwohl postgresinstalliert wird und es sich um die richtige Version handelt, wird das Skript zum Einrichten des Clusters nicht ordnungsgemäß ausgeführt. Es ist ein Verpackungsproblem.

Wenn Sie mit postgreseinem Skript vertraut sind, können Sie es ausführen, um diesen Cluster zu erstellen und loszulegen postgres. Es gibt jedoch einen einfacheren Weg.

Zuerst die alte Postgres-Installation löschen. Das Problem liegt derzeit bei 9.1, daher gehe ich davon aus, dass Sie dies installiert haben

sudo apt-get remove --purge postgresql-9.1

Jetzt einfach neu installieren

sudo apt-get install postgresql-9.1

Notieren Sie den Paketnamen mit der Versionsnummer. HTH.

Stewart
quelle
3
das hat mir bei postgres 9.3 geholfen.
Sevenseacat
1
Dies sollte die akzeptierte Antwort sein, funktioniert auch mit Postgres 9.4 / Ubuntu 14.10
Malte
1
Diese Antwort half mir beim Verwechseln von Postgres 9.4 und 9.3. Cool.
Ingo
2
Arbeitete für Ubuntu 16.04 und Postgres 9.5, musste aber zuerst jedes Postgres-bezogene Paket löschen.
Evert
2
Das ist wirklich eine großartige Antwort! Und auch eine schreckliche Benutzererfahrung auf der Seite von
postgres
23

Die Fehlermeldung bezieht sich auf einen Unix-Domain-Socket, daher müssen Sie Ihren netstatAufruf optimieren , um sie nicht auszuschließen. Versuchen Sie es also ohne die Option -t:

netstat -nlp | grep 5432

Ich würde vermuten, dass der Server tatsächlich auf dem Socket lauscht /tmp/.s.PGSQL.5432und nicht, /var/run/postgresql/.s.PGSQL.5432dass Ihr Client versucht, eine Verbindung herzustellen. Dies ist ein typisches Problem bei der Verwendung von handkompilierten PostgreSQL-Paketen oder PostgreSQL-Paketen von Drittanbietern unter Debian oder Ubuntu, da die Standardquelle für das Unix-Domain-Socket-Verzeichnis ist, diese /tmpjedoch durch das Debian-Paket geändert wird /var/run/postgresql.

Mögliche Problemumgehungen:

  • Verwenden Sie die von Ihrem Drittanbieter-Paket bereitgestellten Clients (Anruf /opt/djangostack-1.3-0/postgresql/bin/psql). Deinstallieren Sie möglicherweise die von Ubuntu gelieferten Pakete vollständig (möglicherweise schwierig aufgrund anderer umgekehrter Abhängigkeiten).
  • Korrigieren Sie das Socket-Verzeichnis des Drittanbieter-Pakets, damit es mit Debian / Ubuntu kompatibel ist.
  • Verwenden Sie -H localhostdiese Option , um eine Verbindung über TCP / IP herzustellen.
  • Verwenden Sie -h /tmpoder eine gleichwertige PGHOSTEinstellung, um auf das richtige Verzeichnis zu verweisen.
  • Verwenden Sie keine Pakete von Drittanbietern.
Peter Eisentraut
quelle
19

Das funktioniert bei mir:

Edit: postgresql.conf

sudo nano /etc/postgresql/9.3/main/postgresql.conf

Aktivieren oder hinzufügen:

listen_addresses = '*'

Starten Sie das Datenbankmodul neu:

sudo service postgresql restart

Sie können die Datei auch überprüfen pg_hba.conf

sudo nano /etc/postgresql/9.3/main/pg_hba.conf

Und fügen Sie Ihr Netzwerk oder Ihre Host-Adresse hinzu:

host    all             all             192.168.1.0/24          md5
engelhaft
quelle
Die listen_address = '*' hat den Trick gemacht. es hörte nur auf "localhost" und nicht auf 127.0.0.1. Dankeschön!
mwm
Mein Gott ... endlich funktionierte etwas - nichts anderes funktionierte, bis ich die Adresse und die unkommentierte Listen_Adresse hinzufügte.
AntonB
Plus eins! Es hat bei mir funktioniert.
Atul Makwana
1
Dies funktioniert auf Ubuntu Windows Bash.
Ahmadalibaloch
Ich kann bestätigen, dass es auf Ubuntu Server Command Bash unter Windows 10 funktioniert.
Ronald
18

Mit dieser Option können Sie psql -U postgres -h localhosterzwingen, dass die Verbindung über TCP statt über UNIX-Domänensockets hergestellt wird. Ihre netstatAusgabe zeigt, dass der PostgreSQL-Server den Port 5432 von localhost überwacht.

Sie können herausfinden, welcher lokale UNIX-Socket vom PostgrSQL-Server verwendet wird, indem Sie einen anderen Aufruf von netstat verwenden :

netstat -lp --protocol=unix | grep postgres

In jedem Fall werden die Schnittstellen konfiguriert, auf denen der PostgreSQL-Server lauscht postgresql.conf.

Riccardo Murri
quelle
17

Erstelle einfach einen Softlink wie diesen:

ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432
Uriel
quelle
1
Dies funktionierte für mich und schien die einfachste Lösung zu sein, ohne Ihre postgresql-Konfiguration ändern zu müssen. Stellen Sie sicher, dass Sie Superuser sind, wenn Sie versuchen, einen Link zu erstellen.
brendan
2
ln: Fehler beim Erstellen des symbolischen Links '/var/run/postgresql/.s.PGSQL.5432': Datei existiert
P_M
Ich habe den Ordner "postgresql" in / var / run / directory erstellt. Es war nicht vorhanden.
Ikrom
Funktioniert erstaunlich, was ist der Grund dafür?
Teoman Shipahi
7

Ich mache es so:

dpkg-reconfigure locales

Wählen Sie Ihre bevorzugten Ländereinstellungen aus und führen Sie sie aus

pg_createcluster 9.5 main --start

(9.5 ist meine Version von postgresql)

/etc/init.d/postgresql start

und dann klappt es!

sudo su - postgres
psql
mymusise
quelle
Hah, sorry, ich denke die Befehle haben es deutlich gemacht. Bei mir tritt dieses Problem auf, wenn ich postgresql neu installiere. Ich versuche, es nach Typ neu zu starten, service postgresql restart aber es besagt, dass ich keinen postgresql-Cluster habe. Dann finde ich den Weg, um mir zu helfen :)
mymusise
Nun, nach drei Stunden Googeln hast du endlich mein Problem behoben. dpkg-reconfigure localesist verdammt wichtig.
Don Mums
5

Ich musste PostgreSQL 8.1 unter Debian Squeeze kompilieren, weil ich Project Open verwende, das auf OpenACS basiert und nicht auf neueren Versionen von PostgreSQL ausgeführt werden kann.

Die Standard-Kompilierungskonfiguration setzt das unix_socketin /tmp, aber Project Open, das auf PostgreSQL basiert, würde nicht funktionieren, da es nach dem unix_socketat sucht /var/run/postgresql.

Es gibt eine Einstellung in postgresql.conf, um die Position der Steckdose festzulegen. Mein Problem war, dass ich entweder festlegen konnte /tmpund psqlarbeitete, aber kein Projekt offen hatte, oder dass ich festlegen konnte /var/run/postgresqlund psqlnicht funktionierte, aber ein Projekt offen hatte.

Eine Lösung für das Problem besteht darin, den Socket zu setzen /var/run/postgresqlund dann psqlauf Peters Vorschlag folgendermassen auszuführen :

psql -h /var/run/postgresql

Dies wird lokal mit lokalen Berechtigungen ausgeführt. Der einzige Nachteil ist, dass es mehr tippt als nur "psql".

Der andere Vorschlag, den jemand machte, war, eine symbolische Verbindung zwischen den beiden Orten herzustellen. Dies funktionierte auch, aber der Link verschwand beim Neustart. Es ist vielleicht einfacher, einfach das Argument -h zu verwenden, aber ich habe den symbolischen Link aus dem PostgreSQL-Skript in erstellt /etc/init.d. Ich habe den Befehl zum Erstellen eines symbolischen Links im Abschnitt "Start" platziert. Wenn ich einen Stopp- und Startbefehl gebe oder einen Neustartbefehl gebe, wird natürlich versucht, eine vorhandene symbolische Verknüpfung wiederherzustellen, aber abgesehen von einer Warnmeldung liegt darin wahrscheinlich kein Schaden.

In meinem Fall anstelle von:

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

ich habe

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

und haben den unix_socket explizit auf /var/run/postgresql/.s.PGSQL.5432in gesetzt postgresql.conf.

Joe
quelle
3

Lösung:

Mach das

export LC_ALL="en_US.UTF-8"

und das. ( 9.3 ist meine aktuelle PostgreSQL-Version. Schreiben Sie Ihre Version!)

sudo pg_createcluster 9.3 main --start
Bogdanvlviv
quelle
woooow, es war die einzige Lösung meines Problems, danke.
user3687723
3

Wenn Ihr Postgres-Dienst fehlerfrei ausgeführt wird oder wenn beim Starten des Postgres-Dienstes kein Fehler auftritt und der genannte Fehler weiterhin auftritt, gehen Sie folgendermaßen vor

Schritt 1: Beim Ausführen pg_lsclusterswerden alle Postgres-Cluster aufgelistet, die auf Ihrem Gerät ausgeführt werden

z.B:

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

Höchstwahrscheinlich ist der Status in Ihrem Fall und im Postgres-Dienst nicht verfügbar

Schritt 2: Starten Sie den pg_ctlcluster neu

#format is pg_ctlcluster <version> <cluster> <action>
sudo pg_ctlcluster 9.6 main start

#restart postgres
sudo service postgres restart

Schritt 3: Schritt 2 ist fehlgeschlagen und hat einen Fehler ausgelöst

Wenn dieser Vorgang nicht erfolgreich ist, wird ein Fehler ausgegeben. Sie können das Fehlerprotokoll sehen/var/log/postgresql/postgresql-9.6-main.log

Mein Fehler war:

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`

Schritt 4: Überprüfen Sie den Besitz von Postgres

Stellen Sie sicher, dass dies postgresder Eigentümer von ist/var/lib/postgresql/version_no/main

Wenn nicht, renne

sudo chown postgres -R /var/lib/postgresql/9.6/main/

Schritt 5: Überprüfen Sie, ob der Benutzer postgres zur Benutzergruppe ssl-cert gehört

Es stellte sich heraus, dass ich den Postgres-Benutzer fälschlicherweise aus der ssl-certGruppe entfernt hatte. Führen Sie den folgenden Code aus, um das Benutzergruppenproblem zu beheben und die Berechtigungen zu korrigieren

#set user to group back with
sudo gpasswd -a postgres ssl-cert

# Fix ownership and mode
sudo chown root:ssl-cert  /etc/ssl/private/ssl-cert-snakeoil.key
sudo chmod 740 /etc/ssl/private/ssl-cert-snakeoil.key

# now postgresql starts! (and install command doesn't fail anymore)
sudo service postgres restart
Noushad
quelle
2

In meinem Fall wurde es durch einen Tippfehler verursacht, den ich während der Bearbeitung gemacht habe /etc/postgresql/9.5/main/pg_hba.conf

Ich habe mich verändert:

# Database administrative login by Unix domain socket
local   all             postgres                                peer

zu:

# Database administrative login by Unix domain socket
local   all             postgres                                MD5

Musste MD5aber klein geschrieben sein md5:

# Database administrative login by Unix domain socket
local   all             postgres                                md5
Mehdi Nellen
quelle
1
Dies ist die Antwort , dass es für mich gerichtet :) hatte ich meine zuvor geändert trustedstatt trustund hat den Dienst nicht neu, und es brach erst am nächsten Tag , als ich bereits vergessen , was ich geändert
Phlippie Bosman
2

Ich fand die Deinstallation von Postgres nicht überzeugend. Dies hilft, mein Problem zu lösen:

  1. Starten Sie den Postgres-Server:

    sudo systemctl start postgresql
    
  2. Stellen Sie sicher, dass der Server beim Booten startet:

    sudo systemctl enable postgresql
    

Detaillierte Informationen finden Sie auf der DigitalOcean-Website hier.

parlad neupane
quelle
2

Ich konnte dieses Problem mit meinem Postgres-9.5-Server nicht lösen. Nach 3 Tagen ohne Fortschritt, bei denen ich alle Korrekturen auf dieser und anderen Websites durchgeführt habe, habe ich beschlossen, den Server neu zu installieren und 5 Tage Arbeit zu verlieren. Aber ich habe das Problem auf der neuen Instanz repliziert. Dies könnte eine Perspektive bieten, wie Sie das Problem beheben können, bevor Sie den katastrophalen Ansatz wählen, den ich gewählt habe.

Deaktivieren Sie zunächst alle Protokolleinstellungen in postgresql.conf. Dies ist der Abschnitt:

# ERROR REPORTING AND LOGGING

Kommentiere alles in diesem Abschnitt aus. Starten Sie dann den Dienst neu.

Verwenden Sie beim Neustart /etc/init.d/postgresql start oder restartich fand es hilfreich, beim Neustart im Superuser-Modus zu sein. Ich hatte ein X-Fenster nur für diese Operation geöffnet. Diesen Superuser-Modus können Sie mit einrichten sudo -i.

Stellen Sie sicher, dass der Server mit diesem einfachen Befehl erreichbar ist: psql -l -U postgres

Wenn sich das nicht beheben lässt, überlegen Sie Folgendes:

Ich habe den Eigentümer für viele Ordner geändert, als ich versucht habe, eine Lösung zu finden. Ich wusste, dass ich wahrscheinlich versuchen würde, diese Ordnereigentümer und chmods für zwei weitere Tage zurückzusetzen. Wenn Sie bereits mit diesen Ordnereigentümern in Konflikt geraten sind und Ihren Server nicht vollständig bereinigen möchten, beginnen Sie, die Einstellungen für alle betroffenen Ordner zu verfolgen, um sie auf den ursprünglichen Zustand zurückzusetzen. Möglicherweise möchten Sie versuchen, eine parallele Installation auf einem anderen System durchzuführen und den Besitz und die Einstellungen aller Ordner systematisch zu überprüfen. Langwierig, aber Sie können möglicherweise auf Ihre Daten zugreifen.

Sobald Sie Zugriff haben, ändern Sie systematisch jede relevante Zeile im # ERROR REPORTING AND LOGGINGAbschnitt der postgresql.confDatei. Neustart und Test. Ich stellte fest, dass der Standardordner für die Protokolle einen Fehler verursachte. Ich habe ausdrücklich auskommentiert log_directory. Der Standardordner, in den das System die Protokolle ablegt, ist dann /var/log/postgresql.

jurban1997
quelle
1

Möglicherweise ist dies passiert, weil Sie die Berechtigungen des /var/lib/postgresql/9.3/mainOrdners geändert haben .

Versuchen Sie es mit dem folgenden Befehl auf 700 zu ändern:

sudo chmod 700 main
Farzin
quelle
1

Dies hängt nicht genau mit der Frage zusammen, da ich Flask verwende, aber dies war der genaue Fehler, den ich erhalten habe, und dies war der relevanteste Thread, um Ideen zu erhalten.

Mein Setup: Windows-Subsystem für Linux, Docker-Compose mit Makefile mit Dockerfile, Flask, Postgresql (unter Verwendung eines Schemas aus Tabellen)

Um eine Verbindung zu postgres herzustellen, richten Sie Ihre Verbindungszeichenfolge wie folgt ein:

from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql+psycopg2://<user>:<password>@<container_name_in_docker-compose.yml>/<database_name>"

ANMERKUNG: Ich habe nie eine IP (z. B. localhost, 127.0.0.1) für die Arbeit mit einer Methode in diesem Thread erhalten. Die Idee, den Containernamen anstelle von localhost zu verwenden, kam von hier: https://github.com/docker-library/postgres/issues/297

Stellen Sie Ihr Schema ein:

from sqlalchemy import MetaData
db = SQLAlchemy(app, metadata=MetaData(schema="<schema_name>"))

Legen Sie beim Einrichten Ihrer Sitzung den Suchpfad für Ihre Funktionen fest:

db.session.execute("SET search_path TO <schema_name>")
Josh Graham
quelle
0

Ich hatte genau das gleiche Problem, das Peter Eisentraut beschrieb. Mit dem netstat -nlp | grep 5432Befehl konnte ich sehen, dass der Server den Socket abhörte /tmp/.s.PGSQL.5432.

Um dies zu beheben, bearbeiten Sie einfach Ihre postgresql.confDatei und ändern Sie die folgenden Zeilen:

listen_addresses = '*'
unix_socket_directories = '/var/run/postgresql'

Führen service postgresql-9.4 restartSie nun (Ersetzen Sie 9-4 durch Ihre Version) aus, und die Remoteverbindungen sollten jetzt funktionieren.

Um nun lokale Verbindungen zuzulassen, erstellen Sie einfach einen symbolischen Link zum /var/run/postgresqlVerzeichnis.

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

Vergessen Sie nicht, sicherzustellen, dass Sie auch pg_hba.confrichtig konfiguriert sind.

Justin Lessard
quelle
0

In meinem Fall musste ich nur Folgendes tun:

sudo service postgresql restart

und dann

sudo -u postgres psql

Das hat gut funktioniert. Ich hoffe es hilft. Prost :) .

Pranay Dugar
quelle
0

Finden Sie Ihre Datei:

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

Ergebnis:

/tmp/.s.PGSQL.5432

Login als postgres Benutzer:

su postgres
psql -h /tmp/ yourdatabase
Waldeyr Mendes da Silva
quelle
0

Ich hatte das gleiche Problem (auf Ubuntu 15.10 (schlau)). sudo find / -name 'pg_hba.conf' -printoder sudo find / -name 'postgresql.conf' -printleer aufgetaucht. Davor schienen mehrere Instanzen von postgresql installiert zu sein.

Möglicherweise haben Sie ähnliche Probleme, wenn Sie eine Liste mit installierten oder Abhängigkeitsproblemen anzeigen

.../postgresql
.../postgresql-9.x 

und so weiter.

In diesem Fall müssen Sie sudo apt-get autoremovejedes Paket 1 zu 1.

Dann folge dem Brief und es wird dir gut gehen. Vor allem, wenn es darum geht, zuerst Schlüssel zu importieren und zur Quellliste hinzuzufügen

sudo apt-get update && sudo apt-get -y install python-software-properties && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

Wenn Sie wily nicht verwenden, ersetzen Sie es wilydurch Ihre Version, dh durch die Ausgabe vonlsb_release -cs

sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ wily-pgdg main" >> /etc/apt/sources.list.d/postgresql.list'
sudo apt-get update && sudo apt-get install postgresql-9.3 pgadmin3

Und dann sollten Sie in Ordnung sein und in der Lage sein, Benutzer zu verbinden und zu erstellen.

Erwartete Ausgabe:

Creating new cluster 9.3/main ...
config /etc/postgresql/9.3/main
data   /var/lib/postgresql/9.3/main
locale en_US.UTF-8
socket /var/run/postgresql
port   5432

Quelle meiner Lösungen (Credits)

Grmn
quelle
0

Während ich das gleiche Problem hatte, habe ich etwas anderes ausprobiert:

Ich habe den postgresql-Daemon manuell gestartet:

FATAL:  could not create shared memory segment ...
   To reduce the request size (currently 57237504 bytes), reduce PostgreSQL's
   shared memory usage, perhaps by reducing shared_buffers or max_connections.

Also , was ich tat , war eine untere Grenze für setzen shared_buffersund max_connectionsin postgresql.confund restartden Service.

Dies hat das Problem behoben!

Hier ist das vollständige Fehlerprotokoll:

$ sudo service postgresql start
 * Starting PostgreSQL 9.1 database server                                                                                                                                                               * The PostgreSQL server failed to start. Please check the log output:
2013-06-26 15:05:11 CEST FATAL:  could not create shared memory segment: Invalid argument
2013-06-26 15:05:11 CEST DETAIL:  Failed system call was shmget(key=5432001, size=57237504, 03600).
2013-06-26 15:05:11 CEST HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.  You can either reduce the request size or reconfigure the kernel with larger SHMMAX.  To reduce the request size (currently 57237504 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
    If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.
    The PostgreSQL documentation contains more information about shared memory configuration.
DrFalk3n
quelle
0

Nach vielen anstrengenden Versuchen habe ich die Lösung auf Basis anderer Beiträge gefunden!

dpkg -l | grep postgres
apt-get --purge remove <package-founded-1> <package-founded-2>
whereis postgres
whereis postgresql
sudo rm -rf <paths-founded>
sudo userdel -f postgres
Douglas Rosa
quelle
0

Erstellen Sie das postgresql- Verzeichnis in run und führen Sie dann den folgenden Befehl aus.

ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432
Pradeep Maurya
quelle
0

Fügen Sie einfach / tmp unix_socket_directories hinzu

postgresql.conf

unix_socket_directories = '/var/run/postgresql,/tmp'
Blau
quelle