Non riesco ad accedere a PostgreSQL a volte dopo l'aggiornamento dell'app server


3

Sto eseguendo l'ultima versione di Mavericks 10.9.5 sul mio Mac Mini Server. Prima dell'aggiornamento all'ultima versione dell'app Server 3.2.1 sono stato in grado di accedere a PostgreSQL nelle mie applicazioni Ruby on Rails e tramite il servizio Web. Dopo aver installato l'app server ho implementato nuovamente Phusion Passenger in /Library/Server/Web/Config/apache2/httpd_server_app.conf. Ho quindi aperto l'app Server e verificato che il servizio Web fosse attivato.

Le mie applicazioni Ruby on Rails hanno smesso di funzionare affermando che ho avuto il seguente errore:

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"?

Ho controllato il file plist / Library / Server / PostgreSQL / Config / org.postgresql.postgres.plist. Le due impostazioni che di solito modifico per eliminare questo errore sono le seguenti. Questo era il codice che funzionava prima che aggiornassi l'App Server. Ho verificato per accertarmi che il codice nel plist fosse modificato dopo l'aggiornamento di Mavericks e dell'app Server.

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

Quando eseguo il comando sudo serveradmin fullstatus postgres ecco l'output.

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"

Quando stavo eseguendo 9.2.4 postgresIsResponding era impostato su yes e PGserverVersion era 90204. Non sono sicuro che qualcosa sia cambiato tra PostgreSQL versione 9.2 e 9.3.

Ho effettuato ricerche sul Web ma non riesco a trovare post recenti in merito utilizzando le ultime versioni di Mavericks e l'app Server.

Questo è anche pubblicato in Server Fault .

Ecco cosa succede quando lo faccio ps -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

Ecco l'output quando eseguo psql -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?


Quindi stai usando l'istanza PostgreSQL integrata in Mac OS X? Non uno di terze parti? Cosa ps -ef | grep postgresmostra? Se provi a connetterti tramite tcp / ip con psql -h localhostcosa succede?
Craig Ringer,

Sto usando quello integrato in Mac OS X. Ho appena aggiunto l'output per ps -ef | grep postgres.
Pamela Cook - LightBe Corp

Ho appena aggiunto l'output per psql -h localhost
Pamela Cook - LightBe Corp

Risposte:


1

È presente un bug nel processo di aggiornamento, in cui non viene eseguita la migrazione dei database precedenti a causa di un'opzione di configurazione aggiornata che impedisce l'avvio di postgresql.

Ecco i passaggi per risolverlo:

  1. Interrompere il servizio Postgres:

    sudo su
    serveradmin stop postgres
    
  2. Aggiorna il campo di configurazione:

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

    sostituire unix_socket_directorycon unix_socket_directories quindi salvare ed uscire

  3. Sposta la cartella dei dati PostgreSQL:

    mv /Library/Server/PostgreSQL/Data /Library/Server/PostgreSQL/DataOld
    
  4. Ricrea la cartella standard PostgreSQL Data e inizializza un database vuoto:

    sudo -u _postgres /Applications/Server.app/Contents/ServerRoot/usr/bin/initdb /Library/Server/PostgreSQL/Data -E utf8 --lc-collate=C --lc-ctype=C
    
  5. Aggiorna i dati nel database vuoto con i dati della cartella DataOld:

    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. Riavvia il servizio PostgreSQL:

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

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


Attualmente utilizzo il servizio Web per ospitare un sito Web oltre a utilizzare la loro istanza PostgreSQL per i database utilizzati nelle mie applicazioni Ruby on Rails. Ho visto questa soluzione prima. Ero riluttante a farlo perché temevo che avrebbe rovinato qualsiasi funzione Apple usando il database. Da quello che ricordo diverse opzioni nell'app Server uso PostgreSQL incluso il servizio Web. Aggiungi informazioni su se questa soluzione ha avuto esito positivo per le persone che utilizzano il servizio Web o altri servizi nell'app Server che utilizzano PostgreSQL.
Pamela Cook - LightBe Corp

Uso il servizio Web e dopo la migrazione tutto funziona ancora per me. Tutto ciò che fa è migrare i database personalizzati (puoi guardare lo schema), non toccare alcun database creato da Apple (sembrano essere conservati in altri percorsi).
Lkraider,

Sono contento di sapere che la tua soluzione non ha interrotto il servizio Web. Tuttavia, ho deciso di ripristinare i miei server sul backup subito prima di aggiornare l'app server. Per fortuna ho perso pochissimi dati. Dopo questa esperienza ho deciso di capire come installare un'altra versione di PostgreSQL per evitare che ciò accada di nuovo. Craig Ringer ha pubblicato un link nella sua risposta che offre tre modi per farlo. codefellows.org/blog/… .
Pamela Cook - LightBe Corp,

Se stai cercando di eseguire il tuo PostgreSQL su OSX, non posso raccomandare abbastanza postgresapp.com .
Lkraider,

Lo proverò. Sembra che potrebbe essere più facile da implementare quindi usando Homebrew.
Pamela Cook - LightBe Corp,

0

Il tuo problema è che Apple sembra aver cambiato le directory socket unix e la porta tcp utilizzate.

Nota queste opzioni passate al postmaster (che hanno rinominato postgres_real):

  • -c unix_socket_directories=/Library/Server/ProfileManager/Config/var/PostgreSQL
  • -c listen_addresses= (Sì, non è uguale a niente)

In altre parole, è in ascolto su un socket privato in una posizione non predefinita e non in ascolto su TCP / IP. Hanno anche modificato le autorizzazioni del socket per negare l'accesso ad altri utenti:

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

Mi congratulo con Apple per averlo finalmente fatto, anche se sembrano averlo fatto nel peggior modo possibile. La loro installazione PostgreSQL è stata una sofferenza per molto tempo perché tendeva a entrare in conflitto con altre installazioni. Ho segnalato un bug a riguardo anni fa. È un grosso problema se il loro processo di aggiornamento sta scartando i dati dell'utente, come sembra, però.

Suggerisco di installare un server PostgreSQL per il vostro sviluppo. Le scelte popolari sono Homebrew e Postgres.app di Heroku. Vedi https://www.codefellows.org/blog/three-battle-tested-ways-to-install-postgresql .

Se si vuole cercare di integrare la vostra applicazione in app Server come avete fatto prima, è necessario impostare host: /Library/Server/ProfileManager/Config/var/PostgreSQLin database.yml. Ma davvero, sono abbastanza sicuro che Apple stia cercando di creare un'istanza PostgreSQL privata solo per il loro uso ...


Quindi chiunque abbia creato database usando PostgreSQL integrato deve rifare tutti i propri database usando qualcos'altro. È stato bello avere a che fare solo con un'installazione di PostgreSQL. Sono su un torrente poiché non riesco a eseguire un backup finale dei miei database poiché non riesco a collegarmi a loro. Cosa faccio ora?
Pamela Cook - LightBe Corp

Stavo usando pgAdmin per eseguire il backup dei miei database. Non mi permetterà di rimuovere il numero di porta nelle proprietà. Forse posso accedere al database in database.yml. Come posso fare i backup di quei database? Sembra che a questo punto potrei aver perso tutti i miei dati se non riesco a creare backup. Posso tornare alla versione precedente dell'app Server dalla mia Time Machine?
Pamela Cook - LightBe Corp

@LightBeCorp Per prima cosa vedi se i dati sono presenti nel DB aggiornato, non farti prendere dal panico. Inizia con psql 'host=/Library/Server/ProfileManager/Config/var/PostgreSQL dbname=mydatabase'. Potrebbe essere necessario che sudol'utente server.appesegua come; Non posso dirti quale sia il tuo pselenco sopra che mostra solo userid numerici, non nomi utente. Se è possibile connettersi, è possibile pg_dump -Fcil database e ripristinarlo in una nuova istanza PostgreSQL. L'unico modo in cui i dati verrebbero effettivamente persi è se l'aggiornamento server.app lo ha eliminato / scartato perché non sapeva che fosse lì; non sappiamo che sia successo.
Craig Ringer,

@LightBeCorp Detto questo, questa è una lezione sugli oggetti per cui dovresti evitare di archiviare i tuoi dati nel database di alcune app che ritiene "propri". Cose divertenti possono accadere quando si aggiorna. Come minimo, dovresti davvero fare un backup prima di qualsiasi aggiornamento e ovviamente fare backup automatici regolari (preferibilmente ogni giorno).
Craig Ringer,

@LightBeCorp Evitare Non tentare di ripristinare con Time Machine. Potresti solo peggiorare le cose.
Craig Ringer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.