pg_upgrade parámetro de configuración no reconocido "unix_socket_directory"

13

Estoy tratando de actualizar Postgresql de 9.2 a 9.3 en Fedora 18 usando este comando como usuario de postgres

$ pg_upgrade -b /bin -B /usr/pgsql-9.3/bin -d /var/lib/pgsql/data -D /var/lib/pgsql/9.3/data/ -j 2 -u postgres

El error en el registro

comando: "/ bin / pg_ctl" -w -l "pg_upgrade_server.log" -D "/ var / lib / pgsql / data" -o "-p 50432 -b -c listen_addresses = '' -c unix_socket_permissions = 0700 -c unix_socket_directory = '/ var / lib / pgsql' "inicio >>" pg_upgrade_server.log "2> & 1 esperando que se inicie el servidor .... FATAL: parámetro de configuración no reconocido" unix_socket_directory ".... detenido esperando pg_ctl: no se pudo iniciar servidor

Como señaló a_horse en los comentarios, ese parámetro fue reemplazado por unix_socket_directories(plural) en 9.3. Pero la versión del servidor que se está iniciando es la anterior 9.2:

$ /bin/pg_ctl --version
pg_ctl (PostgreSQL) 9.2.4

¿Algunas ideas?

Clodoaldo
fuente
2
Ese parámetro ha sido renombrado a unix_socket_directories: postgresql.org/docs/current/static/release-9-3.html#AEN114343
a_horse_with_no_name
@a_horse Ese comando intenta iniciar la versión 9.2. Compruebe la pregunta actualizada
Clodoaldo
Para ver explícitamente qué parámetro se está utilizando en su distribución, puede ejecutarpostgres --describe-config | grep -o 'unix_socket_director\w*'
Randall

Respuestas:

25

Pirateé el problema ejecutando (como root):

mv /usr/bin/pg_ctl{,-orig}
echo '#!/bin/bash' > /usr/bin/pg_ctl
echo '"$0"-orig "${@/unix_socket_directory/unix_socket_directories}"' >> 
     /usr/bin/pg_ctl
chmod +x /usr/bin/pg_ctl

Ejecuta pg_upgradesegún lo previsto, luego deshace el truco:

mv -f /usr/bin/pg_ctl{-orig,}

El problema es que pg_upgrade ejecuta el programa pg_ctrl con argumentos que especifican archivos en el antiguo "directorio_socket_unix" en lugar de los nuevos "directorios_socket_unix" (tenga en cuenta que el segundo es plural). Este truco cambia el nombre del original /usr/bin/pg_ctla /usr/bin/pg_ctl-orig, y luego crea un script de shell en su lugar que simplemente llama al programa original pg_ctl, pasando todos los argumentos con cualquier cadena "unix_socket_directory" cambiado a "unix_socket_directories".

En bash, uno puede cambiar una parte de una cadena, digamos de bara bazen una variable $foo, usando ${foo/bar/baz}(tenga en cuenta que esto no cambia la variable, sino que devuelve el contenido modificado de la variable). Las matrices también se pueden usar ${x/y/z}para recuperar una matriz con todo su contenido reemplazado, todo a la vez. La variable $@es una matriz que contiene todos los argumentos pasados ​​al programa / script / función, por lo que el nuevo script pg_ctl ejecuta el antiguo con todos los argumentos cambiados del antiguo nombre del directorio al nuevo.

Ziggy Crueltyfree Zeitgeister
fuente
3
¡Esto realmente me permitió actualizar Postgres 9.2 a 9.6 en Centos 7! ¡Gracias!
sunsetjunks
2
Me funcionó muy bien al pasar de 9.2 a 9.6. ¡Muchas gracias! ¡No tengo idea de lo que hubiera hecho sin esta respuesta!
SebK
También funcionó para mí, pasando de 9.2 a 9.6 en Centos 7
Gabriel Theron
1
Quizás explicar el truco del hack de bash podría ayudar a otros a lidiar con problemas similares en el futuro. Esta es una torsión grave :-)
xor007
Solución excelente y elegante, funcionó a la perfección para pasar de PostgreSQL 9.2 a 10.7 en CentOS 7
wfgeo
5

He tenido el mismo problema. Estaba actualizando de Fedora Repo's 9.2.4 a PGDG 9.3. La fuente del problema es que Fedora soporta cambios de parámetros unix_socket_directorya unix_socket_directories(ver https://bugzilla.redhat.com/show_bug.cgi?id=853353 ).

Mi solución es reconstruir las pg_upgradefuentes desde, con la actualización del archivo contrib/pg_upgrade/server.c:199donde pg_upgradeverifica la versión del servidor:

199:       (GET_MAJOR_VERSION(cluster->major_version) < 903) ?

, en mi caso lo cambio a:

199:       (GET_MAJOR_VERSION(cluster->major_version) < 900) ?

(Ver mi archivo de parche aquí ).

Ali Akbar
fuente
¿Podría explicar por qué esto soluciona el problema (a personas como yo, que no están demasiado familiarizadas con las fuentes (¡cuidado con la subestimación!))?
dezso
44
Según el comentario de @a_horse anterior, PostgreSQL ascendente ha cambiado el parámetro unix_socket_directorya la unix_socket_directoriesversión 9.3. Pero el mantenedor de Fedora lo soporta a la versión inferior. Entonces, pg_upgradedesde el repositorio YUM de PGDG (PostgreSQL Global Development Group) se espera que la versión 9.2.4 acepte unix_socket_directory, pero en realidad el 9.2.4 del repositorio YUM de Fedora acepta unix_socket_directories. En este caso, debido a que Fedora lo soporta a la versión 9.0 en adelante, lo cambié para usar unix_socket_directoriespara la versión> = 9.0.
Ali Akbar