469 Stimmen

`pg_tblspc` fehlt nach der Installation der neuesten Version von OS X (Yosemite oder El Capitan)

Ich benutze Postgres von Homebrew auf meinem OS X, aber wenn ich mein System neu starte, startet Postgres manchmal nach dem Neustart nicht und ich versuche manuell, es mit postgres -D /usr/local/var/postgres zu starten, aber dann tritt der Fehler mit folgender Meldung auf: FATAL: konnte das Verzeichnis "pg_tblspc" nicht öffnen: Datei oder Verzeichnis nicht gefunden.

Das letzte Mal, als es passierte, konnte ich es nicht in den Originalzustand zurückversetzen, also beschloss ich, das gesamte Postgres-System zu deinstallieren, dann neu zu installieren und Benutzer, Tabellen, Datensätze usw. zu erstellen... Es war wirklich ärgerlich, aber es tritt häufig auf meinem System auf, sagen wir einmal alle paar Monate.

Warum geht die pg_tblspc-Datei so häufig verloren? Und gibt es etwas, das ich tun kann, um den Verlust der Datei zu vermeiden?

Ich habe mein Homebrew und Postgres nicht auf die neueste Version aktualisiert (ich benutze die gleiche Version). Auch alles, was ich in der Postgres-Datenbank gemacht habe, ist, die Tabelle zu löschen und täglich mit neuen Daten zu füllen. Ich habe den Benutzer, das Passwort usw. nicht geändert.

EDIT (mbannert): Ich fühlte das Bedürfnis, das hinzuzufügen, da der Thread das Top-Ergebnis bei Google für dieses Problem ist und für viele das Symptom unterschiedlich ist. Homebrew-Nutzer werden wahrscheinlich diese Fehlermeldung erhalten:

Datei oder Verzeichnis nicht gefunden
Läuft der Server lokal und akzeptiert er
Verbindungen über Unix-Domänensockel "/tmp/.s.PGSQL.5432"?

Also, wenn Sie dies gerade nach dem Upgrade auf Yosemite erlebt haben, sind Sie jetzt abgesichert, indem Sie diesen Thread lesen.

935voto

Donovan Punkte 15927

Gelöst... teilweise.

Offensichtlich löscht die Installation der neuesten Versionen von OS X (z.B. Yosemite oder El Capitan) einige Verzeichnisse in /usr/local/var/postgres.

Um dies zu beheben, erstellen Sie einfach die fehlenden Verzeichnisse neu:

mkdir -p /usr/local/var/postgres/pg_commit_ts
mkdir -p /usr/local/var/postgres/pg_dynshmem
mkdir -p /usr/local/var/postgres/pg_logical/mappings
mkdir -p /usr/local/var/postgres/pg_logical/snapshots
mkdir -p /usr/local/var/postgres/pg_replslot
mkdir -p /usr/local/var/postgres/pg_serial
mkdir -p /usr/local/var/postgres/pg_snapshots
mkdir -p /usr/local/var/postgres/pg_stat
mkdir -p /usr/local/var/postgres/pg_stat_tmp
mkdir -p /usr/local/var/postgres/pg_tblspc
mkdir -p /usr/local/var/postgres/pg_twophase

Oder, knapper formuliert (Danke an Nate):

mkdir -p /usr/local/var/postgres/{{pg_commit_ts,pg_dynshmem,pg_replslot,pg_serial,pg_snapshots,pg_stat,pg_stat_tmp,pg_tblspc,pg_twophase},pg_logical/{mappings,snapshots}}

Wenn Sie nun pg_ctl start -D /usr/local/var/postgres erneut ausführen, startet der Server normalerweise und zumindest für mich ohne Datenverlust.

UPDATE

Auf meinem System sind einige dieser Verzeichnisse auch dann leer, wenn Postgres läuft. Möglicherweise entfernt Yosemite im Rahmen einer "Reinigungs"-Operation leere Verzeichnisse? In jedem Fall habe ich in jedem Verzeichnis eine ".keep"-Datei erstellt, um zukünftige Löschungen zu verhindern.

touch /usr/local/var/postgres/{{pg_commit_ts,pg_dynshmem,pg_replslot,pg_serial,pg_snapshots,pg_stat,pg_stat_tmp,pg_tblspc,pg_twophase},pg_logical/{mappings,snapshots}}/.keep

Hinweis: Durch das Erstellen der .keep-Datei in diesen Verzeichnissen kann es zu einigen Einträgen in Ihrem Protokoll kommen, wirkt sich jedoch anscheinend nicht negativ auf sonst nichts aus.

9voto

tony_k Punkte 1915

Donavans Antwort ist genau richtig, ich wollte nur hinzufügen, dass als ich verschiedene Dinge mit der Datenbank gemacht habe (z.B. rake db:test), sie nach verschiedenen Verzeichnissen gesucht hat, die oben nicht erwähnt wurden und abstürzen würden, wenn sie nicht vorhanden waren, in meinem Fall pg_logical/mappings, also möchten Sie möglicherweise ein Terminal einrichten, das Folgendes ausführt:

tail -f /usr/local/var/postgres/server.log

und es auf fehlende Ordner überwachen, während Sie durch Ihre typischen Datenbankaktivitäten gehen.

6voto

MCP Punkte 4356

Dies ist leicht abseits des Themas, aber es lohnt sich, dies hier im Rahmen des PostgreSQL Yosemite-Wiederherstellungsprozesses zu erwähnen. Ich hatte das gleiche Problem wie oben UND ich hatte ein Problem mit PostgreSQL, das anscheinend im Hintergrund lief, sodass ich selbst nach dem Hinzufügen von Verzeichnissen nicht neu starten konnte. Ich versuchte, pg_ctl stop -m fast zu verwenden, um den PostgreSQL-Server zu beenden, aber ohne Erfolg. Ich versuchte auch, direkt auf den Prozess zuzugreifen mit kill PID, aber sobald ich das tat, erschien ein PostgreSQL-Prozess mit einer anderen PID.

Der Schlüssel war schließlich eine .plist-Datei, die Homebrew geladen hatte... Die Lösung für mich war:

launchctl unload /Users/me/Library/LaunchAgents/homebrew.mxcl.postgresql92.plist

Danach konnte ich PostgreSQL normal starten.

4voto

tee Punkte 3869

Die fehlenden Verzeichnisse müssen im PostgreSQL-Datenverzeichnis vorhanden sein. Das Standard-Datenverzeichnis ist /usr/local/var/postgres/. Wenn Sie ein anderes Datenverzeichnis eingerichtet haben, müssen Sie die fehlenden Verzeichnisse dort neu erstellen. Wenn Sie die von Homebrew empfohlene .plist-Datei geändert haben, die PostgreSQL startet, finden Sie dort das Datenverzeichnis:

cat ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

(es ist die -D-Option, mit der Sie Postgres gestartet haben:)

  ProgramArguments

    /usr/local/bin/postgres
    -D
    /usr/local/pgsql/data

In dem obigen Beispiel würden Sie die fehlenden Verzeichnisse in /usr/local/pgsql/data erstellen, wie folgt:

cd /usr/local/pgsql/data
mkdir {pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots,pg_logical}
mkdir pg_logical/{snapshots,mappings}

0voto

Bronson Punkte 219

Ich hatte dieses Problem mit einer dockerisierten Rails-Anwendung.

Statt dass pg_tblspc und andere Verzeichnisse aus /usr/local/var/postgres fehlten, fehlten sie aus meinemRailsApp/tmp/db.

Sie werden eine ähnliche Version von Donovans Lösung verwenden wollen, Sie müssen nur den Pfad für Ihre Rails-Anwendung anpassen...

mkdir /myRailsApp/tmp/db/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/

Außerdem sollten Sie eine .keep-Datei hinzufügen, damit git die leeren Verzeichnisse nicht ignoriert.

touch /myRailsApp/tmp/db/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/.keep

Ich habe einen Fehler mit einer .keep-Datei in 1 der Verzeichnisse bemerkt, also lesen Sie die Befehlszeilenausgabe sorgfältig und passen Sie sie bei Bedarf an.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X