Ich habe gerade postgres über neu installiert brew install postgres
Ich bin gelaufen, habe initdb /usr/local/var/postgres -E utf8
aber folgendes:
The files belonging to this database system will be owned by user "atal421".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.UTF-8".
The default text search configuration will be set to "english".
initdb: directory "/usr/local/var/postgres" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/usr/local/var/postgres" or run initdb
with an argument other than "/usr/local/var/postgres".
rm -rf
Also habe ich den Postgres-Ordner und lief es noch einmal:
initdb /usr/local/var/postgres -E utf8
es hieß alles in ordnung:
Success. You can now start the database server using:
postgres -D /usr/local/var/postgres
Also habe ich diesen Befehl ausgeführt und Folgendes erhalten:
postgres -D /usr/local/var/postgres
FATAL: lock file "postmaster.pid" already exists
HINT: Is another postmaster (PID 13731) running in data directory "/usr/local/var/postgres"?
Wenn ich jetzt auf meinen Aktivitätsmonitor schaue, sehe ich 6 Postgress-Instanzen.
Wie behebe ich das?
postgres
mit einem Postmaster und fünf Utility-Backends. PostgreSQL ist eine Multiprozessarchitektur.Antworten:
Öffentliche Bekanntmachung: niemals löschen
postmaster.pid
. Ja wirklich. Gute Möglichkeit, Datenkorruption zu bekommen.Sie hatten bereits PostgreSQL installiert und haben das Datenverzeichnis gelöscht, ohne den laufenden Server anzuhalten. Sie haben jetzt einige verwaiste PostgreSQL-Serverprozesse, die gelöschte Datendateien verwalten, sodass sie im Dateisystem nicht mehr verfügbar sind und vollständig gelöscht werden, wenn das zuletzt geöffnete Dateihandle für sie geschlossen wird. Sie können
pg_ctl
den Server nicht wie gewohnt herunterfahren, da Sie das Cluster-Datenverzeichnis gelöscht haben. Sie müssen also einfach die Prozesse beenden. Töte den Postmeister ( benutze ihn nichtkill -9
, es reicht ein gewöhnlicher Kill) und der Rest wird ebenfalls heruntergefahren.Sie können dann einen neuen Server im Datadir gegen die aktuellen
initdb
Daten starten .Es ist sehr wahrscheinlich, dass Konflikte auftreten, wenn Sie nicht die andere ältere Version von PostgreSQL deinstallieren.
In einer Nussschale:
cat /usr/local/var/postgres/postmaster.pid
Notieren Sie die Nummer in der ersten Zeile, die die PID des Postmasters ist.
Stellen Sie sicher , mit ,
ps
dass die pid die eines Postgres Postmeister ist.Beenden Sie den Postmaster-Prozess mit dem folgenden Befehl und ersetzen Sie 'PID' durch die Nummer, die Sie notiert haben. Auch hier nicht verwenden
kill -9
oderkill -KILL
nur eine einfache Verwendungkill
, dh einSIGTERM
:kill PID
Wenn die PID nicht die eines Postgres-Postmasters ist , überprüfen Sie manuell
kill
allepostgres
noch laufenden Backends, ob sie nicht mehr ausgeführt werden, und entfernen Sie sie erst dannpostmaster.pid
. (Sie müssen auch sicherstellen, dass sich daspostmaster.pid
nicht auf einem gemeinsam genutzten Speicher befindet, auf dem der Server möglicherweise auf einer anderen VM / einem anderen Host ausgeführt wird.)quelle
kill PID
hat bei mir nicht funktioniert. Ich brauchtekill -3 PID
. In meinem Fall hatte ich einen Shutdown durchgeführt, der möglicherweise Terminalfenster getötet hat, ohne die Prozesse ordnungsgemäß zu stoppen. Siekill -3 PID
haben den Prozess getötet und ihre Kinder haben mich erfolgreich wieder mit Postgres beginnen lassen.Eine andere Möglichkeit ist, dass Sie ein hartes Herunterfahren hatten und der Postgres-Prozess ohne Bereinigung seiner PID-Datei abgestürzt ist. Dies passiert mir, wenn der Akku meines Laptops leer ist.
Diese Lösung ist nicht für ein Produktivsystem gedacht, und Sie sollten wirklich sicherstellen, dass der Postgres-Daemon nicht ausgeführt wird , aber ich verwende meinen Laptop zum Codieren und mache mir keine Sorgen, dass ich meine Datenbanken neu generieren muss .
Wenn auf diesem Port ein anderer oder gar kein Prozess ausgeführt wird, löschen Sie einfach die PID-Datei, z
und postgres wird bald gut anlaufen.
Um herauszufinden, ob an diesem Port ein anderer Prozess ausgeführt wird, können Sie Folgendes tun
Dann renne
um zu sehen, ob es funktioniert hat. Das solltest du sehen
(oder zumindest habe ich das erst gesehen, nachdem ich das oben Genannte getan habe :-))
(Und wirklich, sollte Postgres nicht klug genug sein, um zu erkennen, dass es mit PID 933 keinen Prozess gibt, und die gefälschte PID-Datei selbst entfernen?)
quelle
postmaster.pid
Datei zeigte. Dies war einige Tage nach einem unsauberen Herunterfahren (Laptop-Installation von Postgres unter OSX über Homebrew).rm postmaster.pid
bei mir geklappt. Ich sehe keine Datenbeschädigung (aber in jedem Fall ist dies nur eine Entwicklungsmaschine).~/Library/Application Support/Postgres/data/postmaster.pid
ich wieder einsatzbereit.Ich habe das alles ohne Erfolg versucht, nachdem ich auf Yosemite upgegradet hatte.
Dann bin ich auf diesen Blog-Beitrag gestoßen: http://ruckus.tumblr.com/post/100355276496/yosemite-upgrade-breaks-homebrew-installed-postgres
Zuerst musste ich die fehlenden Verzeichnisse erstellen, die anscheinend während des Upgrades gelöscht wurden (danke Apple!).
Dann starte postgres einfach wieder mit der normalen Homebrew-Startsequenz:
Vielen Dank an Ruckus Notes für die Hilfe bei der Lösung meines Problems. Hoffentlich hilft es dir auch.
quelle
HARTE REBOOT-ANWEISUNGEN
Ich hatte das gleiche Problem nach einem harten Neustart. Nachdem
postmaster.pid
ich die PID der Datei überprüft hatte , bemerkte ich, dass kein Prozess ausgeführt wurde. Ich wollte die .pid-Datei nicht hart löschen, sondern habe einenpg-stop
Alias verwendet, den ich in meinem erstellt hatte.bash_profile
. Dieser Alias läuft einfachpg_ctl -D /usr/local/var/postgres stop -s -m fast
Als Referenz
Protokollausgabe nach
pg-stop
brauen
Ich dachte, ich sollte hier auch erwähnen, dass, wenn Sie Postgres mit Homebrew installiert haben, Sie
brew services
einen Blick darauf werfen sollten. So starte / stoppe ich jetzt lieber meine Datenbanken.quelle
Ich habe diesen Fehler nach einem Absturz meines Computers erhalten. PostgreSQL konnte aufgrund dieses Fehlers nicht einmal gestartet werden, daher war es nicht die Lösung, den Prozess zu beenden. Ich habe einfach eine Sicherungskopie erstellt und dann die
postmaster.pid
Datei gelöscht. Dann wurde der Fehler gestoppt und PG konnte erneut gestartet werden.quelle
Manchmal können die Demütigen
pg_ctl -w restart
den Trick machen :-)quelle
/usr/pgsql/9.3/data/postmaster.pid
nicht in ps aux.)Das Löschen von postmaster.pid ist eigentlich eine wirklich anständige Sache, die Sie bei jedem Start blind machen müssen. Das macht mein System. Da Sie gerade hochgefahren sind, wissen Sie, dass kein Postgres-Prozess ausgeführt wird. Wenn Sie nach einem unsauberen Herunterfahren eine Wiederherstellung durchführen, wird diese Datei Ihre Wiederherstellung verhindern.
Ein besseres Design für Postgres wäre, die Datei postmaster.pid im Dateisystem / run abzulegen, damit sie bei jedem Neustart garantiert gelöscht wird. Viele andere Server arbeiten auf diese Weise.
quelle