No puedo acceder a PostgreSQL a veces después de la actualización de la aplicación del servidor

Estoy ejecutando la última versión de Mavericks 10.9.5 en mi Mac Mini Server. Antes de la actualización a la última versión de Server App 3.2.1, podía acceder a PostgreSQL en mis aplicaciones Ruby on Rails y a través del servicio web. Después de instalar la aplicación Server, implementé Phusion Passenger nuevamente en /Library/Server/Web/Config/apache2/httpd_server_app.conf. Luego abrí la aplicación del servidor y verifiqué que el servicio web estaba activado.

Mis aplicaciones de Ruby on Rails dejaron de funcionar indicando que tenía el siguiente error:

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

Revisé el archivo plist /Library/Server/PostgreSQL/Config/org.postgresql.postgres.plist. Las dos configuraciones que suelo modificar para deshacerme de este error son las siguientes. Este fue el código que funcionó antes de actualizar la aplicación del servidor. Verifiqué para asegurarme de que el código en el plist se modificó después de la actualización de Mavericks y la aplicación del servidor.

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

Cuando ejecuto el comando sudo serveradmin fullstatus postgres aquí está el resultado.

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"

Cuando estaba ejecutando 9.2.4, postgresIsResponding estaba establecido en sí y PGserverVersion era 90204. No estoy seguro de si algo cambió entre PostgreSQL versión 9.2 y 9.3.

He realizado búsquedas en la web, pero no puedo encontrar ninguna publicación reciente sobre esto usando las últimas versiones de Mavericks y la aplicación Server.

Esto también se publica en Server Fault .

Esto es lo que sucede cuando lo hagops -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

Aquí está la salida cuando ejecutopsql -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?
Entonces, ¿está utilizando la instancia de PostgreSQL integrada en Mac OS X? ¿No es de terceros? ¿Qué ps -ef | grep postgresmuestra? Si intenta conectarse a través de tcp/ip, psql -h localhost¿qué sucede?
Estoy usando el integrado en Mac OS X. Acabo de agregar la salida para ps -ef | greppostgres.
Acabo de agregar la salida para psql -h localhost

Respuestas (2)

Hay un error en el proceso de actualización, donde no migra las bases de datos anteriores debido a una opción de configuración actualizada que impide que se inicie postgresql.

Estos son los pasos para resolverlo:

  1. Detenga el servicio de postgres:

    sudo su
    serveradmin stop postgres
    
  2. Actualice el campo de configuración:

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

    reemplazar unix_socket_directorycon unix_socket_directoriesluego guardar y salir

  3. Mueva la carpeta de datos de PostgreSQL:

    mv /Library/Server/PostgreSQL/Data /Library/Server/PostgreSQL/DataOld
    
  4. Vuelva a crear la carpeta de datos estándar de PostgreSQL e inicialice una base de datos en blanco:

    sudo -u _postgres /Applications/Server.app/Contents/ServerRoot/usr/bin/initdb /Library/Server/PostgreSQL/Data -E utf8 --lc-collate=C --lc-ctype=C
    
  5. Actualice los datos en la base de datos en blanco con datos de la carpeta 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. Reinicie el servicio PostgreSQL:

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

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

Actualmente uso el servicio web para alojar un sitio web además de usar su instancia de PostgreSQL para las bases de datos que se usan en mis aplicaciones de Ruby on Rails. Vi esta solución antes. Me resistí a hacerlo porque me preocupaba que estropeara las funciones de Apple al usar la base de datos. Por lo que recuerdo, varias opciones en la aplicación Server usan PostgreSQL, incluido el servicio web. Agregue información sobre si esta solución fue exitosa para las personas que usan el servicio web u otros servicios en la aplicación del servidor que usan PostgreSQL.
Uso el servicio web y, después de la migración, todo sigue funcionando para mí. Todo lo que hace es migrar las bases de datos personalizadas (puede mirar el esquema), no toca ninguna base de datos creada por Apple (parecen estar guardadas en otras rutas).
Me alegra saber que su solución no rompió el servicio web. Sin embargo, decidí restaurar mis servidores a la copia de seguridad justo antes de actualizar la aplicación del servidor. Perdí muy pocos datos afortunadamente. Después de esta experiencia, he decidido averiguar cómo instalar otra versión de PostgreSQL para evitar que esto vuelva a suceder. Craig Ringer publicó un enlace en su respuesta que brinda tres formas de lograr esto. codefellows.org/blog/… .
Si está buscando ejecutar su propio PostgreSQL en OSX, no puedo recomendar lo suficiente postgresapp.com .
Voy a intentarlo. Parece que puede ser más fácil de implementar que usar Homebrew.

Su problema es que Apple parece haber cambiado los directorios de socket de Unix y el puerto tcp utilizado.

Tenga en cuenta estas opciones pasadas al administrador de correos (que han renombrado postgres_real):

  • -c unix_socket_directories=/Library/Server/ProfileManager/Config/var/PostgreSQL
  • -c listen_addresses=(Sí, eso es igual a nada)

En otras palabras, escucha en un socket privado en una ubicación no predeterminada y no escucha en TCP/IP. También han cambiado los permisos de socket para denegar el acceso a otros usuarios:

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

Aplaudo a Apple por finalmente hacer esto, aunque parece que lo han hecho de la peor manera posible. Su instalación de PostgreSQL ha sido un gran dolor durante mucho tiempo porque tiende a entrar en conflicto con otras instalaciones. Reporté un error al respecto hace años. Sin embargo, es un problema importante si su proceso de actualización descarta los datos del usuario, como parece ser.

Sugiero instalar un servidor PostgreSQL para su uso de desarrollo. Las opciones populares son Homebrew y Postgres.app de Heroku. Consulte https://www.codefellows.org/blog/three-battle-tested-ways-to-install-postgresql .

Si desea intentar integrar su aplicación en la aplicación Servidor como lo hizo antes, deberá host: /Library/Server/ProfileManager/Config/var/PostgreSQLconfigurar database.yml. Pero en realidad, estoy bastante seguro de que Apple está tratando de hacer de eso una instancia privada de PostgreSQL solo para su uso...

Entonces, cualquier persona que haya creado bases de datos usando su PostgreSQL incorporado tiene que rehacer todas sus bases de datos usando otra cosa. Fue agradable solo tener que lidiar con una instalación de PostgreSQL. Estoy en un riachuelo ya que no puedo hacer una copia de seguridad final de mis bases de datos ya que no puedo conectarme a ellas. ¿Qué hago ahora?
Estaba usando pgAdmin para realizar copias de seguridad de mis bases de datos. No me permite quitar el número de puerto en las propiedades. Tal vez pueda acceder a la base de datos en base de datos.yml. ¿Cómo puedo hacer copias de seguridad de esas bases de datos? Parece que he perdido todos mis datos en este punto si no puedo crear copias de seguridad. ¿Puedo volver a la versión anterior de la aplicación Server desde mi Time Machine?
@LightBeCorp Primero vea si los datos están en la base de datos actualizada, no entre en pánico todavía. Comience con psql 'host=/Library/Server/ProfileManager/Config/var/PostgreSQL dbname=mydatabase'. Es posible que necesite sudoque el usuario server.appse ejecute como; No puedo decirle qué es eso, ya que su pslistado anterior muestra solo ID de usuario numéricos, no nombres de usuario. Si puede conectarse, puede pg_dump -Fcrestaurar la base de datos en una nueva instancia de PostgreSQL. La única forma en que los datos se perderían realmente es si la actualización de server.app los eliminara/descartara porque no sabía que estaban allí; no sabemos que pasó.
@LightBeCorp Dicho esto, esta es una lección objetiva sobre por qué debe evitar almacenar sus datos en la base de datos de alguna aplicación que cree que "posee". Pueden pasar cosas divertidas cuando actualizas. Como mínimo, realmente debería realizar una copia de seguridad antes de cualquier actualización y, por supuesto, realizar copias de seguridad automáticas periódicas (preferiblemente diarias) de todos modos.
@LightBeCorp No intente retroceder con Time Machine. Podrías empeorar las cosas.
Punto bien tomado sobre las copias de seguridad. Normalmente realizo copias de seguridad manuales cuando se producen actualizaciones en la base de datos. De vez en cuando, he tratado de encontrar un software para realizar copias de seguridad automáticas de PostgreSQL, pero no pude encontrar muchos comentarios sobre los pocos programas que encontré. La mayor parte de la información tiene varios años. Probé el comando psql usando sudo y agregando mi nombre de usuario pero obtuve el mismo error. Está apuntando al enchufe antiguo. Incluso si cambio el plist a la configuración de Unix mencionada, sigo teniendo el mismo error. Me pregunto si algo se rompió en la aplicación Server cuando cambiaron al nuevo PostgreSQL.
@LightBeCorp Si lo usaste, nopsql 'host=/Library/Server/ProfileManager/Config/var/PostgreSQL' debería darte el mismo error. Si le dio exactamente el mismo error, entonces probablemente no entendió el comando del todo bien.
Me rendí e hice una restauración del sistema usando la copia de seguridad justo antes de instalar la aplicación del servidor. Afortunadamente no tuve muchos cambios en la base de datos que se perdieron. He hecho mi última actualización de la aplicación del servidor por un tiempo. He realizado copias de seguridad y miraré postgres.app. ¡Gracias de nuevo!