Der Postgresql-Server startet nicht

13

[Ubuntu 16.04] Ich habe postgresql 9.5 zusammen mit Abhängigkeiten installiert:

sudo sh -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql-common
sudo apt-get install postgresql-9.5 libpq-dev

Wenn ich rennen will psql bekomme ich:

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

Aber /var/run/postgresql/ aber leer. Wenn ich posgresql neu starte, scheint alles in Ordnung zu sein:

$ /etc/init.d/postgresql restart
[ ok ] Restarting postgresql (via systemctl): postgresql.service.

$ /etc/init.d/postgresql status
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: active (exited) since wto 2016-09-27 16:18:26 CEST; 1min 15s ago
  Process: 3076 ExecReload=/bin/true (code=exited, status=0/SUCCESS)
  Process: 3523 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 3523 (code=exited, status=0/SUCCESS)

aber wenn ps auxes keine solche PID gibt (warum ??)

Totale Reinstalation hilft überhaupt nicht. Wie kann ich es reparieren?

mike927
quelle
Was zeigt die Datei /var/log/posgtresql/postgresql-9.5-main.log?
Ubfan1
Diese Datei ist leer
mike927

Antworten:

13

Dies ist eine Besonderheit der Systemintegration von PostgreSQL in Xenial.

Die vom postgresql-common-Paket installierte postgresql-Service-Unit ist lediglich ein Dummy-Service, der dazu führt, dass der eigentliche Service [email protected] über eine Abhängigkeit gestartet wird. Sie können diese Abhängigkeit anzeigen, indem Sie den Befehl ausführen

systemctl list-dependencies postgresql

Diese Abhängigkeit ist nicht permanent, sondern wird während des Systemstarts vom systemd-Generator generiert, /lib/systemd/system-generators/postgresql-generatorder auch mit dem Paket postgresql-common geliefert wird. Der Generator prüft, ob der Startmodus in der Datei auf gesetzt /etc/postgresql/9.6/main/start.confist auto, und richtet in diesem Fall die Abhängigkeit ein, die anschließend den Start der Instanz 9.6-main bewirkt.

(Genauer gesagt, es werden alle Konfigurationsunterverzeichnisse überprüft /etc/postgresql/*/*und Abhängigkeiten für alle Instanzen erstellt, die für den automatischen Start konfiguriert sind. In einer Standardinstallation wird jedoch nur eine Instanz vorhanden sein.)

Aufgrund der Einschränkungen von Systemd-Generatoren (siehe man systemd.generator) kann dieser Prozess fehlschlagen und dazu führen, dass die Abhängigkeiten nach einem Neustart nicht mehr vorhanden sind. Systemd startet dann nur den Dummy-Dienst und schreibt

systemd[1]: Starting PostgreSQL RDBMS...
systemd[1]: Started PostgreSQL RDBMS.

zum log aber sonst nichts machen. Versuch, den Dienst manuell über zu starten

systemctl start postgresql

reproduziert nur dieses Ergebnis. Befehl ausführen

systemctl daemon-reload

manuell als root wird der Generator neu gestartet und in den meisten Fällen das Problem bis zum nächsten Neustart behoben.

Um das Problem dauerhaft zu lösen, müssen Sie den Grund finden, warum der Generator während des Startvorgangs ausfällt. Mögliche Ursachen finden Sie in der Manpage systemd.generator. In meinem Fall war es die PostgreSQL-Konfigurationsdatei, /etc/postgresql/9.6/main/postgresql.confdie mit einem anderen Dateisystem verknüpft war, das noch nicht verfügbar war, als der Generator zu Beginn des Startvorgangs ausgeführt wurde. postgresql-generatorÜberprüft das Vorhandensein dieser Datei, auch wenn sie ansonsten nicht benötigt wird.

Tilman
quelle
Fühlen Sie sich frei, Ihre Antwort zu bearbeiten, wenn Sie es schaffen, das Problem zu lösen :)
Sturm
9

Erweitere die Antwort von Tilman, aber nicht genug Kudos, um einen Kommentar abzugeben ...

Wenn Sie nicht benötigen, dass der Dienst postgresql heißt, und sich nicht für den Wrapper-Dummy-Dienst interessieren, sollte dies nur funktionieren, um den tatsächlichen Dienst direkt zu steuern. Der Name lautet: postgresql@$version-$cluster.service In Ihrem Fall sollte es kurz postgresql-9.5-main sein . Beginnen Sie gerne

systemctl start [email protected]

und aufhören:

systemctl stop [email protected]

Der Status gibt Ihnen auch viel bessere und genauere Informationen als über den automatisch generierten Wrapper-Service.

systemctl status [email protected]

Für 9.6 sieht es so aus:

[email protected] - PostgreSQL Cluster 9.6-main
   Loaded: loaded (/lib/systemd/system/[email protected]; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2017-09-13 00:41:50 CEST; 7h ago
  Process: 10235 ExecStop=/usr/bin/pg_ctlcluster --skip-systemctl-redirect -m fast %i stop (code=exited, status=2)
  Process: 10676 ExecStart=postgresql@%i --skip-systemctl-redirect %i start (code=exited, status=0/SUCCESS)
 Main PID: 10683 (postgres)
   CGroup: /system.slice/system-postgresql.slice/[email protected]
           ├─10683 /usr/lib/postgresql/9.6/bin/postgres -D /var/lib/postgresql/9.6/main -c config_file=/etc/postgresql/9.6/main/postgresql.conf
           ├─10685 postgres: 9.6/main: checkpointer process
           ├─10686 postgres: 9.6/main: writer process
           ├─10748 postgres: 9.6/main: wal writer process
           ├─10749 postgres: 9.6/main: autovacuum launcher process
           ├─10750 postgres: 9.6/main: archiver process   last was 000000020000000000000082
           ├─10751 postgres: 9.6/main: stats collector process
Alex K.
quelle
4

In meinem Fall handelte es sich um falsch konfigurierte Gebietsschemas.

Ich habe die Lösung in dieser Antwort von dba.stackexchange.com gefunden :

  1. Verwenden Sie sudo dpkg-reconfigure localesdiese Option , um die erforderlichen Gebietsschemas zu generieren
  2. sudo pg_dropcluster 9.5 mainLöschen Sie den vorhandenen Datenbankcluster über (dadurch werden alle Daten im Cluster gelöscht!).
  3. Erstellen Sie den Cluster über neu sudo pg_createcluster 9.5 main --start
  4. Starten Sie PostgreSQL über neu sudo service postgresql restart
Florian Brucker
quelle
1

Es wäre besser, systemd-Startskripte mit Ubuntu 16.04 zu verwenden, da init-Skripte heutzutage möglicherweise nicht richtig funktionieren. Postgres 9.5 ist bereits in den Ubuntu-Repos, versuchen Sie also, stattdessen das System zu starten.

Amias
quelle
Mit Standard Ubuntu Repo bekomme ich das gleiche Ergebnis
mike927
das ist eine schande, sieht aus wie die postgres leute noch nicht den hang von systemd haben. Sie sollten wahrscheinlich einen Bug gegen das postgres-Paket auslösen oder auf der Mailingliste nach Systemd-Support fragen. Ich benutze nicht viel Postgres, aber einige Open-Source-Projekte haben sich gegen systemd gestellt oder sind vielleicht in interne Debatten über die Unterstützung verwickelt.
Amias
Wenn ich systemctl ausführe, wird "[email protected] loaded failed failed PostgreSQL Cluster 9.5-main" zurückgegeben. Warum ist es gescheitert?
mike927
Nun, in diesem Fall funktionieren die Start-Skripte von systemd nicht richtig, so dass der Rat nicht gerade hilfreich ist.
Tilman
1

Ein anderes "wurde von diesem gebissen".

Die pg_upgradeclusteraktuell verlassene Zielversion (9.6) im "manuellen" Modus auf Port 5433 und die Quellversion (9.5) auf Port 5432.

Auch danach pg_dropcluster 9.5. Das Bearbeiten der Datei start.conf hat nicht geholfen, aber der Hinweis war zu verwenden systemctl daemon-reload, da der Generator basierend auf dieser Konfigurationsdatei entscheidet, ob die Servicedatei symbolisch verknüpft werden soll:

for conf in /etc/postgresql/*/*/postgresql.conf; do
    # trimmed for brevity
    [ "$start" = "auto" ] || continue
    ln -s "$pgservice" "$wantdir/postgresql@$version-$cluster.service"
done

Wenn der Cluster, den Sie starten möchten, in der Datei start.conf nicht das Wort "auto" enthält, müssen Sie ein System-Reload (oder einen Neustart) durchführen, damit er beim Start aktiviert wird.

Müssen dies noch mit einem Neustart überprüfen, aber angesichts der oben genannten recht zuversichtlich, dass das Problem war.

Melvyn Sopacua
quelle
1

Ich habe den magischen "Super Service" wie folgt deaktiviert:

root@server# systemctl disable postgresql

Dann habe ich den konkreten Service aktiviert:

root@server:~# systemctl enable [email protected] 

Nach dem Neustart hat alles wieder funktioniert.

guettli
quelle
0

Hatte den gleichen Fehler, verschwendete Stunden, einfache Lösung. Überprüfen Sie diese SO Frage und meine Antwort, die ist:

sudo service postgresql restart
ToTenMilan
quelle
0

Ich hatte dieses Problem aus einem anderen Grund: Verzeichnisberechtigungen. Ich hatte einen vollwertigen Chmod wie diesen:

chmod -R 644 /etc/postgresql/10/main

Dadurch wird das Verzeichnis als nicht ausführbar festgelegt, sodass Postgres es nicht lesen können.

seequ
quelle
0

Ich hatte das gleiche Problem beim Überprüfen des gefundenen Problems mit der Berechtigung ssl-cert-snakeoil.key.

Eigentümer festlegen

chown root: ssl-cert ssl-cert-snakeoil.key chmod 640 ssl-cert-snakeoil.key

und machte einen sauberen Neustart.

Sudharsan Punniyakotti
quelle