pg_upgrade parametro di configurazione non riconosciuto “unix_socket_directory”


13

Sto cercando di aggiornare Postgresql da 9.2 a 9.3 in Fedora 18 usando questo comando come utente 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

L'errore nel registro

comando: "/ bin / pg_ctl" -w -l "pg_upgrade_server.log" -D "/ var / lib / pgsql / data" -o "-p 50432 -b -c hear_addresses = '' -c unix_socket_permissions = 0700 -c unix_socket_directory = '/ var / lib / pgsql' "start >>" pg_upgrade_server.log "2> & 1 in attesa dell'avvio del server .... FATAL: parametro di configurazione non riconosciuto" unix_socket_directory ".... smesso di attendere pg_ctl: impossibile avviare server

Come sottolineato da a_horse nei commenti quel parametro è stato sostituito da unix_socket_directories(plurale) in 9.3. Ma la versione del server avviata è quella vecchia 9.2:

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

Qualche idea?


2
Quel parametro è stato rinominato in unix_socket_directories: postgresql.org/docs/current/static/release-9-3.html#AEN114343
a_horse_with_no_name

@a_horse Quel comando tenta di avviare la versione 9.2. Controlla la domanda aggiornata
Clodoaldo,

Per vedere esplicitamente quale parametro viene utilizzato nella tua distribuzione, puoi eseguirepostgres --describe-config | grep -o 'unix_socket_director\w*'
Randall il

Risposte:


25

Ho risolto il problema eseguendo (come 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

Esegui pg_upgradecome previsto, quindi annulla l'hack:

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

Il problema è che pg_upgrade esegue il programma pg_ctrl con argomenti che specificano i file nel vecchio "unix_socket_directory" anziché nel nuovo "unix_socket_directories" (nota che il secondo è plurale). Questo hack rinomina l'originale /usr/bin/pg_ctla /usr/bin/pg_ctl-orig, e quindi crea uno script di shell al suo posto che chiama semplicemente il programma pg_ctl originale, passando tutti gli argomenti con tutte le stringhe "unix_socket_directory" cambiato in "unix_socket_directories".

In bash, si può cambiare una porzione di una stringa, dire da bara bazin una variabile $foo, usando ${foo/bar/baz}(nota che questo non cambia la variabile, ma piuttosto restituisce il contenuto modificato della variabile). Gli array possono anche essere utilizzati con ${x/y/z}per recuperare un array con tutto il suo contenuto sostituito, tutto in una volta. La variabile $@è un array che contiene tutti gli argomenti passati al programma / script / funzione, quindi il nuovo script pg_ctl esegue quello vecchio con tutti gli argomenti cambiati dal vecchio nome della directory a quello nuovo.


3
questo mi ha davvero permesso di aggiornare Postgres da 9.2 a 9.6 su Centos 7! Grazie!
Sunsetjunks,

2
Ha funzionato alla grande per me andando da 9.2 a 9.6. Grazie mille! Non ho idea di cosa avrei fatto senza questa risposta!
SebK,

Ha funzionato anche per me, andando dal 9,2 al 9,6 su Centos 7
Gabriel Theron,

1
Forse spiegare l'inganno dell'hack bash potrebbe aiutare gli altri ad affrontare problemi simili in futuro. Questo è un serio colpo di
scena

Soluzione eccellente ed elegante, ha funzionato perfettamente per passare da PostgreSQL 9.2 a 10.7 su CentOS 7
wfgeo,

5

Ho lo stesso problema. Stavo aggiornando da 9.2.4 di Fedora Repo a PGDG 9.3. La fonte del problema è che Fedora esegue il backport delle modifiche unix_socket_directoryal parametro unix_socket_directories(vedere https://bugzilla.redhat.com/show_bug.cgi?id=853353 ).

La mia soluzione è ricostruire il pg_upgradeda fonti, con l'aggiornamento al file contrib/pg_upgrade/server.c:199dove pg_upgradeverifica la versione del server:

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

, nel mio caso lo cambio in:

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

(vedi il mio file patch qui ).


Potresti spiegare perché questo risolve il problema (a persone come me, che non hanno troppa familiarità con le fonti (attenzione all'eufemismo!))?
dezso

4
Come da commento @a_horse sopra, PostgreSQL a monte hanno cambiato il parametro unix_socket_directoryper unix_socket_directoriesla versione 9.3. Ma il manutentore di Fedora lo riporta alla versione inferiore. Quindi, pg_upgradeda PGDG (PostgreSQL Global Development Group) YUM Repository si aspetta che la versione 9.2.4 accetti unix_socket_directory, ma in realtà la 9.2.4 da Fedora YUM Repository accetta unix_socket_directories. In questo caso, poiché Fedora esegue il backport dalla versione 9.0 in poi, l'ho cambiata per usarla unix_socket_directoriesper la versione> = 9.0.
Ali Akbar,
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.