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?
fuente
unix_socket_directories
: postgresql.org/docs/current/static/release-9-3.html#AEN114343postgres --describe-config | grep -o 'unix_socket_director\w*'
Respuestas:
Pirateé el problema ejecutando (como root):
Ejecuta
pg_upgrade
según lo previsto, luego deshace el truco: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_ctl
a/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
bar
abaz
en 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.fuente
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_directory
aunix_socket_directories
(ver https://bugzilla.redhat.com/show_bug.cgi?id=853353 ).Mi solución es reconstruir las
pg_upgrade
fuentes desde, con la actualización del archivocontrib/pg_upgrade/server.c:199
dondepg_upgrade
verifica la versión del servidor:, en mi caso lo cambio a:
(Ver mi archivo de parche aquí ).
fuente
unix_socket_directory
a launix_socket_directories
versión 9.3. Pero el mantenedor de Fedora lo soporta a la versión inferior. Entonces,pg_upgrade
desde el repositorio YUM de PGDG (PostgreSQL Global Development Group) se espera que la versión 9.2.4 acepteunix_socket_directory
, pero en realidad el 9.2.4 del repositorio YUM de Fedora aceptaunix_socket_directories
. En este caso, debido a que Fedora lo soporta a la versión 9.0 en adelante, lo cambié para usarunix_socket_directories
para la versión> = 9.0.