Ich kann nach dem Server-App-Upgrade zeitweise nicht auf PostgreSQL zugreifen

Ich verwende die neueste Version von Mavericks 10.9.5 auf meinem Mac Mini Server. Vor dem Upgrade auf die neueste Version der Server App 3.2.1 konnte ich in meinen Ruby on Rails-Anwendungen und über den Webdienst auf PostgreSQL zugreifen. Nachdem ich die Server App installiert habe, habe ich Phusion Passenger wieder in /Library/Server/Web/Config/apache2/httpd_server_app.conf implementiert. Ich habe dann die Server-App geöffnet und überprüft, ob der Webdienst aktiviert ist.

Meine Ruby on Rails-Anwendungen funktionierten nicht mehr und gaben an, dass ich den folgenden Fehler hatte:

PG::ConnectionBad (could not connect to server: Connection refused
    Is the server running locally and accepting
    connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?

Ich habe die Plist-Datei /Library/Server/PostgreSQL/Config/org.postgresql.postgres.plist überprüft. Die beiden Einstellungen, die ich normalerweise ändere, um diesen Fehler zu beseitigen, sind die folgenden. Dies war der Code, der funktionierte, bevor ich die Server-App aktualisierte. Ich habe überprüft, ob der Code in der Plist nach dem Update von Mavericks und der Server-App geändert wurde.

    <string>listen_addresses=127.0.0.1,::1</string>
    <string>unix_socket_permissions=0777</string>

Wenn ich den Befehl sudo serveradmin fullstatus postgres ausführe, ist hier die Ausgabe.

postgres:dataDirHasBeenInitialized = yes
postgres:PG_VERSION = "9.3.4"
postgres:dataDir = "/Library/Server/PostgreSQL/Data"
postgres:postgresIsResponding = no
postgres:dataDirIsDirectory = yes
postgres:PGserverVersion = 0
postgres:dataDirExists = yes
postgres:setStateVersion = 1
postgres:state = "RUNNING"

Als ich 9.2.4 ausgeführt habe, war postgresIsResponding auf yes gesetzt und PGserverVersion war 90204. Ich bin mir nicht sicher, ob sich zwischen PostgreSQL Version 9.2 und 9.3 etwas geändert hat.

Ich habe Websuchen durchgeführt, kann aber mit den neuesten Versionen von Mavericks und der Server-App keine aktuellen Beiträge dazu finden.

Dies wird auch in Server Fault gepostet .

Hier ist, was passiert, wenn ich das tueps -ef | grep postgres

  220   124     1   0 Mon07AM ??         2:30.39 /usr/bin/python /Applications/Server.app/Contents/ServerRoot/usr/bin/xpostgres -a /Library/Server/ProfileManager/Config/PostgreSQL_config.plist
  220   361   124   0 Mon07AM ??         0:08.36 /Applications/Server.app/Contents/ServerRoot/usr/bin/postgres_real -D /Library/Server/ProfileManager/Config/ServiceData/Data/PostgreSQL -c unix_socket_directories=/Library/Server/ProfileManager/Config/var/PostgreSQL -c logging_collector=on -c log_rotation_size=10MB -c log_connections=on -c log_lock_waits=on -c log_statement=ddl -c log_line_prefix=%t -c listen_addresses= -c log_directory=/Library/Logs/ProfileManager -c log_filename=PostgreSQL-%F.log -c log_min_messages=WARNING -c log_min_error_statement=WARNING -c unix_socket_group=_devicemgr -c unix_socket_permissions=0770 -c max_connections=200
  220   388   361   0 Mon07AM ??         0:00.01 postgres: logger process                                   
  220   401   361   0 Mon07AM ??         0:00.91 postgres: checkpointer process                                   
  220   402   361   0 Mon07AM ??         0:04.07 postgres: writer process                                   
  220   403   361   0 Mon07AM ??         0:03.88 postgres: wal writer process                                   
  220   404   361   0 Mon07AM ??         0:11.83 postgres: autovacuum launcher process                                   
  220   405   361   0 Mon07AM ??         0:01.08 postgres: archiver process                                   
  220   406   361   0 Mon07AM ??         0:33.03 postgres: stats collector process                                   
  220   407   361   0 Mon07AM ??         0:05.01 postgres: wal sender process _devicemgr [local] streaming 0/802DC88                                
  220   484   361   0 Mon07AM ??         0:00.73 postgres: _devicemgr devicemgr_v2m0 [local] idle                                
  220   495   361   0 Mon07AM ??         0:14.02 postgres: _devicemgr devicemgr_v2m0 [local] idle                                
  220   535   361   0 Mon07AM ??         0:00.00 postgres: _devicemgr devicemgr_v2m0 [local] idle                                
  501 75088 74999   0  7:14PM ttys000    0:00.00 grep postgres

Hier ist die Ausgabe, wenn ich sie ausführepsql -h localhost

psql: could not connect to server: Connection refused
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 5432?
could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?
could not connect to server: Connection refused
    Is the server running on host "localhost" (fe80::1) and accepting
    TCP/IP connections on port 5432?
Sie verwenden also die in Mac OS X integrierte PostgreSQL-Instanz? Kein Drittanbieter? Was ps -ef | grep postgreszeigt? Was passiert , wenn Sie versuchen, eine Verbindung über TCP/IP herzustellen psql -h localhost?
Ich verwende die in Mac OS X integrierte Version. Ich habe gerade die Ausgabe für ps -ef | hinzugefügt grep postgres.
Ich habe gerade die Ausgabe für psql -h localhost hinzugefügt

Antworten (2)

Es gibt einen Fehler im Aktualisierungsprozess, bei dem die vorherigen Datenbanken aufgrund einer aktualisierten Konfigurationsoption, die den Start von postgresql verhindert, nicht migriert werden.

Hier sind die Schritte, um es zu lösen:

  1. Beenden Sie den Postgres-Dienst:

    sudo su
    serveradmin stop postgres
    
  2. Aktualisieren Sie das Konfigurationsfeld:

    vim /Library/Server/PostgreSQL/Config/org.postgresql.postgres.plist
    

    ersetzen unix_socket_directorydurch unix_socket_directoriesdann speichern & beenden

  3. Verschieben Sie den PostgreSQL-Datenordner:

    mv /Library/Server/PostgreSQL/Data /Library/Server/PostgreSQL/DataOld
    
  4. Erstellen Sie den standardmäßigen PostgreSQL-Datenordner neu und initialisieren Sie eine leere Datenbank:

    sudo -u _postgres /Applications/Server.app/Contents/ServerRoot/usr/bin/initdb /Library/Server/PostgreSQL/Data -E utf8 --lc-collate=C --lc-ctype=C
    
  5. Aktualisieren Sie die Daten in der leeren Datenbank mit Daten aus dem DataOld-Ordner:

    sudo -u _postgres /Applications/Server.app/Contents/ServerRoot/usr/bin/pg_upgrade -b /Applications/Server.app/Contents/ServerRoot/usr/libexec/postgresql9.2 -B /Applications/Server.app/Contents/ServerRoot/usr/bin -d /Library/Server/PostgreSQL/DataOld -D /Library/Server/PostgreSQL/Data
    
  6. Starten Sie den PostgreSQL-Dienst neu:

    launchctl load -w /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/org.postgresql.postgres.plist
    serveradmin start postgres
    

Quelle: http://www.macambulance.co.uk/os-x-server-3-2-1-update-breaks-postgresql/

Ich verwende den Webdienst derzeit zum Hosten einer Website zusätzlich zur Verwendung ihrer PostgreSQL-Instanz für Datenbanken, die in meinen Ruby on Rails-Anwendungen verwendet werden. Ich habe diese Lösung schon einmal gesehen. Ich zögerte, dies zu tun, weil ich befürchtete, dass es alle Apple-Funktionen, die die Datenbank verwenden, durcheinander bringen würde. Soweit ich mich erinnere, verwenden mehrere Optionen in der Server-App PostgreSQL, einschließlich des Webdiensts. Bitte fügen Sie Informationen darüber hinzu, ob diese Lösung für Personen erfolgreich war, die den Webdienst oder andere Dienste in der Server-App verwenden, die PostgreSQL verwenden.
Ich benutze Web Service und nach der Migration funktioniert alles immer noch für mich. Dies migriert lediglich die benutzerdefinierten Datenbanken (Sie können sich das Schema ansehen), es berührt keine von Apple erstellten Datenbanken (sie scheinen in anderen Pfaden gespeichert zu sein).
Schön zu wissen, dass Ihre Lösung den Webdienst nicht beschädigt hat. Ich habe mich jedoch entschieden, meine Server im Backup wiederherzustellen, bevor ich die Server-App aktualisiert habe. Ich habe zum Glück sehr wenig Daten verloren. Nach dieser Erfahrung habe ich beschlossen, herauszufinden, wie ich eine andere Version von PostgreSQL installieren kann, um hoffentlich zu verhindern, dass dies erneut passiert. Craig Ringer hat in seiner Antwort einen Link gepostet, der drei Möglichkeiten bietet, dies zu erreichen. codefellows.org/blog/… .
Wenn Sie Ihr eigenes PostgreSQL unter OSX ausführen möchten, kann ich postgresapp.com nicht genug empfehlen.
Ich werde es versuchen. Es sieht so aus, als wäre es einfacher zu implementieren als mit Homebrew.

Ihr Problem ist, dass Apple anscheinend die Unix-Socket-Verzeichnisse und den verwendeten TCP-Port geändert hat.

Beachten Sie diese Optionen, die an den Postmaster übergeben wurden (den sie umbenannt haben postgres_real):

  • -c unix_socket_directories=/Library/Server/ProfileManager/Config/var/PostgreSQL
  • -c listen_addresses=(Ja, das ist nichts)

Mit anderen Worten, es lauscht auf einem privaten Socket an einem nicht standardmäßigen Ort und nicht auf TCP/IP. Sie haben auch die Socket-Berechtigungen geändert, um anderen Benutzern den Zugriff zu verweigern:

  • -c unix_socket_group=_devicemgr
  • -c unix_socket_permissions=0770

Ich begrüße Apple dafür, dass es das endlich getan hat – obwohl sie es anscheinend auf die schlechteste Art und Weise getan haben, die sie tun konnten. Ihre PostgreSQL-Installation war lange Zeit ein großes Problem, da sie dazu neigte, mit anderen Installationen in Konflikt zu geraten. Ich habe vor Jahren einen Fehler darüber gemeldet. Es ist jedoch ein großes Problem, wenn ihr Upgrade-Prozess Benutzerdaten verwirft, wie es den Anschein hat.

Ich schlage vor, einen PostgreSQL-Server für Ihre Entwicklungszwecke zu installieren. Beliebte Optionen sind Homebrew und Heroku's Postgres.app . Siehe https://www.codefellows.org/blog/three-battle-tested-ways-to-install-postgresql .

Wenn Sie versuchen möchten, Ihre App wie zuvor in die Server-App zu integrieren, müssen host: /Library/Server/ProfileManager/Config/var/PostgreSQLSie database.yml. Aber wirklich, ich bin mir ziemlich sicher, dass Apple versucht, daraus eine private PostgreSQL-Instanz nur für ihre Verwendung zu machen ...

Jeder, der Datenbanken mit seinem integrierten PostgreSQL erstellt hat, muss also alle seine Datenbanken mit etwas anderem neu erstellen. Es war schön, sich nur mit einer Installation von PostgreSQL auseinandersetzen zu müssen. Ich bin auf einem Bach, da ich keine endgültige Sicherung meiner Datenbanken erstellen kann, da ich keine Verbindung zu ihnen herstellen kann. Was mache ich jetzt?
Ich habe pgAdmin verwendet, um Backups meiner Datenbanken zu erstellen. Es erlaubt mir nicht, die Portnummer in den Eigenschaften zu entfernen. Vielleicht komme ich in database.yml an die Datenbank. Wie kann ich Sicherungskopien dieser Datenbanken erstellen? Es sieht so aus, als hätte ich zu diesem Zeitpunkt alle meine Daten verloren, wenn ich keine Backups erstellen kann. Kann ich von meiner Time Machine zur vorherigen Version der Server-App zurückkehren?
@LightBeCorp Sehen Sie zuerst, ob die Daten in der aktualisierten DB vorhanden sind, noch keine Panik. Beginnen Sie mit psql 'host=/Library/Server/ProfileManager/Config/var/PostgreSQL dbname=mydatabase'. Möglicherweise müssen Sie sudoden Benutzer server.appausführen als; Ich kann Ihnen nicht sagen, was das ist, da Ihre psobige Auflistung nur numerische Benutzer-IDs zeigt, keine Benutzernamen. Wenn Sie eine Verbindung herstellen können, können Sie pg_dump -Fcdie Datenbank in einer neuen PostgreSQL-Instanz wiederherstellen. Die einzige Möglichkeit, dass die Daten tatsächlich verloren gehen, besteht darin, dass das server.app-Upgrade sie löscht/verwirft, weil sie nicht wusste, dass sie vorhanden sind; wir wissen nicht, dass das passiert ist.
@LightBeCorp Das heißt, dies ist ein Lehrbeispiel dafür, warum Sie es vermeiden sollten, Ihre Daten in der Datenbank einer App zu speichern, von der sie glaubt, dass sie "besitzt". Beim Upgrade können lustige Dinge passieren. Zumindest sollten Sie vor jedem Upgrade wirklich ein Backup erstellen - und natürlich sowieso regelmäßig (vorzugsweise täglich) automatisierte Backups durchführen.
@LightBeCorp Versuchen Sie nicht , mit Time Machine ein Rollback durchzuführen. Du könntest alles nur noch schlimmer machen.
Punkt gut über die Backups getroffen. Normalerweise mache ich manuelle Sicherungen, wenn Aktualisierungen in der Datenbank vorgenommen werden. Von Zeit zu Zeit habe ich versucht, Software zu finden, um automatische Backups von PostgreSQL zu erstellen, konnte aber nicht viel Feedback zu den wenigen Programmen finden, die ich gefunden habe. Die meisten Informationen sind mehrere Jahre alt. Ich habe den psql-Befehl mit sudo ausprobiert und meinen Benutzernamen hinzugefügt, aber den gleichen Fehler erhalten. Es zeigt auf die alte Steckdose. Selbst wenn ich die plist auf die genannten Unix-Einstellungen ändere, erhalte ich immer noch den gleichen Fehler. Ich frage mich, ob etwas in der Server-App kaputt gegangen ist, als sie auf das neue PostgreSQL umgestiegen sind.
@LightBeCorp Wenn Sie es verwendet haben, psql 'host=/Library/Server/ProfileManager/Config/var/PostgreSQL'sollte es nicht den gleichen Fehler geben. Wenn es Ihnen genau den gleichen Fehler gab, dann haben Sie den Befehl wahrscheinlich nicht ganz richtig verstanden.
Ich habe aufgegeben und eine Systemwiederherstellung mit dem Backup durchgeführt, kurz bevor ich die Server-App installiert habe. Zum Glück hatte ich nicht viele Datenbankänderungen, die verloren gingen. Ich habe mein letztes Server-App-Update für eine Weile durchgeführt. Ich habe Backups gemacht und werde mir postgres.app ansehen. Danke noch einmal!