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

464

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

Das letzte Mal, als es auftrat, konnte ich es nicht in den ursprünglichen Zustand versetzen, also entschied ich mich, das gesamte Postgres-System zu deinstallieren und es dann neu zu installieren und Benutzer, Tabellen, Datensätze usw. zu erstellen. Es war so ekelhaft, aber Es tritt häufig auf meinem System auf, etwa einmal in einigen Monaten.

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

Ich habe mein Homebrew und Postgres nicht auf die neueste Version aktualisiert (dh ich habe dieselbe Version verwendet). Außerdem habe ich in der Postgres-Datenbank nur die Tabelle gelöscht und die neuen Daten jeden Tag aufgefüllt. Ich habe den Benutzer, das Passwort usw. nicht geändert.

EDIT (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, können Sie diesen Thread jetzt lesen.

Blaszard
quelle
Eep, das sollte es wirklich, wirklich nicht! Wenn Sie "neueste Version" sagen, geben Sie bitte die genaue Versionsnummer an. Haben Sie auch Tablespaces auf externen Speicher gestellt? Wo befindet sich das PostgreSQL-Datenverzeichnis?
Craig Ringer
Auch pg_tblspcist ein Verzeichnis . Die einzige Möglichkeit, dieses Verzeichnis zu sehen und nur dieses Verzeichnis, das zufällig verschwindet, ist eine Beschädigung des Dateisystems oder ein besonders schlecht benommener Virenscanner oder ein Dateisynchronisierungstool.
Craig Ringer
Ich habe keinen Virenscanner. Ich weiß nicht, was es tablespacesist, also glaube ich nicht, dass ich es auf einen externen Speicher gestellt habe.
Blaszard
Hm. Ich kann Ihnen nur sagen, dass etwas schlecht stimmt. pg_tblspcverschwindet nicht einfach auf einem System, auf das ich jemals gestoßen bin, und ich kann mir auch keinen vernünftigen Grund dafür vorstellen. Es wird sehr schwer zu sagen sein, was Ihr System ohne viel mehr Details anders macht.
Craig Ringer
2
Konnten Sie eine Lösung für dieses @Gardecolo finden? Ich habe das gleiche Problem nach dem Upgrade auf Yosemite.
Donovan

Antworten:

928

Gelöst ... teilweise.

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

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 gesagt ( dank Nate ):

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

Durch erneutes Ausführen wird pg_ctl start -D /usr/local/var/postgresder Server jetzt normal und zumindest für mich ohne Datenverlust gestartet .

AKTUALISIEREN

Auf meinem System sind einige dieser Verzeichnisse leer, selbst wenn Postgres ausgeführt wird. Vielleicht entfernt Yosemite im Rahmen eines "Reinigungsvorgangs" alle leeren Verzeichnisse? Auf jeden Fall habe ich in jedem Verzeichnis eine '.keep'-Datei 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 .keepDatei in diesen Verzeichnissen führt zu Rauschen in Ihrer Protokolldatei, scheint jedoch keine negativen Auswirkungen auf andere Elemente zu haben.

Donovan
quelle
53
Nur ein Vorschlag für einen präziseren Befehl: mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/undtouch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep
Nate
26
Diese .keep-Dateien verursachen mir tatsächlich etwas Kummer in den Serverprotokollen:could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
funwhilelost
13
Mir fehlten auch die Verzeichnisse pg_snapshots und pg_stat.
Jon Stevens
8
Ich musste auch ein zusätzliches Verzeichnis 'pg_replslot' erstellen. Nur dass es gut funktioniert. Vielen Dank!
Lucas
6
erlebt wie @Lucas für abgefüllte Postgres 9.4.0. Ich musste mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
Patrick Farrell
9

Donavans Antwort ist genau richtig. Ich wollte nur hinzufügen, dass ich, da ich verschiedene Dinge mit der Datenbank gemacht habe (z. B. rake db:test), nach verschiedenen Verzeichnissen gesucht habe, die oben nicht erwähnt wurden und ersticken würden, wenn sie nicht vorhanden wären In meinem Fall pg_logical/mappingsmöchten Sie möglicherweise ein Terminal einrichten, das ausgeführt wird:

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

und achten Sie auf fehlende Ordner, während Sie Ihre typischen Datenbankaktivitäten durchlaufen.

tony_k
quelle
3
Muss hinzugefügt werden mkdir -p / usr / local / var / postgres / pg_logical / {Schnappschüsse, Zuordnungen}
peter_v
6

Dies ist etwas unangebracht, aber hier im Rahmen des PostgreSQL Yosemite-Wiederherstellungsprozesses erwähnenswert. 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 nicht neu starten konnte. Ich habe versucht pg_ctl stop -m fast, den PostgreSQL-Server zu töten, aber kein Glück. Ich habe auch versucht, den Prozess direkt mit zu kill PIDverfolgen, aber sobald ich dies tat, erschien ein PostgreSQL-Prozess mit einer anderen PID erneut.

Der Schlüssel war eine .plistDatei, die Homebrew geladen hatte ... Das Update für mich war:

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

Danach konnte ich PostgreSQL normal starten.

MCP
quelle
Meine Liste wurde etwas anders benannt: launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plistaber im Grunde war das auch das gleiche Problem für mich und die gleiche Lösung.
Onekiloparsec
4

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 .plistDatei geändert haben , mit der PostgreSQL gestartet wird, finden Sie das Datenverzeichnis dort:

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

(Es ist die -DOption, 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 /usr/local/pgsql/datawie 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}
Tee
quelle
-20

Das Erstellen der fehlenden Verzeichnisse funktioniert sicherlich, aber ich habe es behoben, indem ich postgres db neu initialisiert habe. Dies ist ein sauberer Ansatz, um zukünftige Probleme zu vermeiden.

HINWEIS: Mit diesem Ansatz werden vorhandene Datenbanken gelöscht

$ rm -r /usr/local/var/postgres
$ initdb -D /usr/local/var/postgres
Greg
quelle
19
Offensichtlich ist das Löschen vorhandener Datenbanken hier keine geringfügige Ausnahme. Dies ist ein bisschen so, als würde man sagen "Ich konnte / var / tmp nicht finden, also habe ich das Betriebssystem neu installiert."
Adam Donahue
4
Oh Mann, das ist "sauberer" als alles, was ich mir vorstellen kann :) Hoffe nur, dass ein zufälliger Copy-Paster aus dem Interwebz dies nicht direkt in ihre Konsole schießt, ohne es anzusehen :)
Halil Özgür
2
Entschuldigen Sie die Ablehnung von Greg, aber ich empfehle, Ihre Lösung neu zu formulieren, um deutlich zu machen, dass dieser Ansatz nur in der Entwicklung verwendet werden sollte oder wenn der Benutzer es sich leisten kann, seine Datenbank zu löschen.
Hraynaud
1
Warum wird das so herabgestuft? Auf einem Dev-Server ist dies der richtige Weg.
Jordon Bedwell
@JordonBedwell selbst auf einem Entwicklungsserver ist eine schlechte Idee, es sei denn, Sie spielen mit einer einzelnen App, die db auf Ihrem Computer verwendet. Es ist wie "Ich kann meinen Lieblingscode-Editor nicht starten, lassen Sie uns das Betriebssystem neu installieren"
Andre Figueiredo