wake-up-neo.net

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

Ich verwende Postgres von Homebrew in meinem OS X, aber wenn ich mein System neu starte, startet das Postgres manchmal nicht nach dem Neustart, und so habe ich manuell versucht, es mit postgres -D /usr/local/var/postgres Zu starten, aber dann trat der Fehler mit auf die folgende Meldung: FATAL: could not open directory "pg_tblspc": No such file or directory.

Als es das letzte Mal auftrat, konnte ich es nicht in den ursprünglichen Zustand versetzen, also entschied ich mich, das gesamte postgres-System zu deinstallieren und es dann erneut zu installieren und Benutzer, Tabellen, Datensätze usw. zu erstellen. Es war so ekelhaft, aber es kommt auf meinem System häufig vor, etwa alle paar Monate.

Warum verliert es dann häufig die Datei pg_tblspc? Und kann ich irgendetwas tun, um den Verlust der Datei zu vermeiden?

Ich habe mein Homebrew und Postgres nicht auf die neueste Version aktualisiert (d. H. Ich habe dieselbe Version verwendet). Alles, was ich in der Postgres-Datenbank getan habe, ist, die Tabelle zu löschen und die neuen Daten jeden Tag zu füllen. Ich habe den Benutzer, das Passwort usw. nicht geändert.

BEARBEITEN (mbannert): Ich hatte das Bedürfnis, dies hinzuzufügen, da der Thread der Top-Hit bei Google für dieses Problem ist und für viele das Symptom anders ist. Homebrewer werden wahrscheinlich auf diese Fehlermeldung stoßen:

No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

Wenn Sie dies erst nach dem Yosemite-Upgrade erlebt haben, lesen Sie diesen Thread erst einmal.

458
Blaszard

Gelöst ... zum Teil.

Anscheinend werden durch die Installation der neuesten Versionen von OS X (z. B. Yosemite oder El Capitan) einige Verzeichnisse in /usr/local/var/postgres Entfernt.

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

mkdir /usr/local/var/postgres/pg_tblspc
mkdir /usr/local/var/postgres/pg_twophase
mkdir /usr/local/var/postgres/pg_stat
mkdir /usr/local/var/postgres/pg_stat_tmp
mkdir /usr/local/var/postgres/pg_replslot
mkdir /usr/local/var/postgres/pg_snapshots

Oder genauer ( danke an Nate):

mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/

Das erneute Ausführen von pg_ctl start -D /usr/local/var/postgres Startet den Server nun normal und zumindest für mich ohne Datenverlust.

[~ # ~] Update [~ # ~]

Auf meinem System sind einige dieser Verzeichnisse leer, auch wenn Postgres ausgeführt wird. Vielleicht entfernt Yosemite im Rahmen eines Reinigungsvorgangs leere Verzeichnisse? In jedem Fall habe ich eine ".keep" -Datei in jedem Verzeichnis erstellt, um ein zukünftiges Löschen zu verhindern.

touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/.keep

Hinweis: Das Erstellen der Datei .keep In diesen Verzeichnissen verursacht Rauschen in Ihr Logfile, scheint aber nichts anderes zu beeinträchtigen.

924
Donovan

Donavan s Antwort ist genau richtig, ich wollte nur hinzufügen, dass ich verschiedene Dinge mit der Datenbank gemacht habe (z. B. rake db:test), es wurde nach verschiedenen Verzeichnissen gesucht, die oben nicht erwähnt wurden und erstickten, wenn sie nicht vorhanden waren, in meinem Fall pg_logical/mappings, daher möchten Sie möglicherweise ein Terminal einrichten, das ausgeführt wird:

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

und suchen Sie nach fehlenden Ordnern, während Sie Ihre typischen Datenbankaktivitäten ausführen.

9
tony_k

Dies ist ein wenig vom Thema abweichend, sollte jedoch im Rahmen des PostgreSQL Yosemite-Wiederherstellungsprozesses hier erwähnt werden. Ich hatte das gleiche Problem wie oben UND ich hatte ein Problem mit PostgreSQL, das "scheinbar" im Hintergrund lief, sodass ich selbst nach dem Hinzufügen von Verzeichnissen keinen Neustart durchführen konnte. Ich habe versucht mit pg_ctl stop -m fast, um den PostgreSQL-Server zu töten, aber kein Glück. Ich habe auch versucht, den Prozess direkt mit kill PID aber sobald ich das getan habe, tauchte ein PostgreSQL-Prozess mit einer anderen PID wieder auf.

Der Schlüssel war schließlich ein .plist Datei, die Homebrew geladen hatte ... Der Fix für mich lautete:

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

Danach konnte ich PostgreSQL normal starten.

6
MCP

Die fehlenden Verzeichnisse müssen in Ihrem PostgreSQL-Datenverzeichnis vorhanden sein. Das Standarddatenverzeichnis 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 Datei .plist Geändert haben, mit der PostgreSQL gestartet wird, finden Sie das Datenverzeichnis dort:

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

(Dies ist die Option -D, mit der Sie postgres gestartet haben :)

  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/postgres</string>
    <string>-D</string>
    <string>/usr/local/pgsql/data</string>

Im obigen Beispiel würden Sie die fehlenden Verzeichnisse in /usr/local/pgsql/data Wie folgt erstellen:

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}
4
tee