pg_upgrade paramètre de configuration non reconnu «unix_socket_directory»


13

J'essaie de mettre à niveau Postgresql de 9.2 à 9.3 dans Fedora 18 en utilisant cette commande en tant qu'utilisateur 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'erreur dans le journal

commande: "/ 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' "start >>" pg_upgrade_server.log "2> & 1 en attente de démarrage du serveur .... FATAL: paramètre de configuration non reconnu" unix_socket_directory ".... arrêté en attente pg_ctl: n'a pas pu démarrer serveur

Comme l'a souligné a_horse dans les commentaires, ce paramètre a été remplacé par unix_socket_directories(pluriel) en 9.3. Mais la version du serveur démarrée est l'ancienne 9.2:

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

Des idées?


2
Ce paramètre a été renommé unix_socket_directories: postgresql.org/docs/current/static/release-9-3.html#AEN114343
a_horse_with_no_name

@a_horse Cette commande essaie de démarrer la version 9.2. Vérifiez la question mise à jour
Clodoaldo

Pour voir explicitement quel paramètre est utilisé dans votre distribution, vous pouvez exécuterpostgres --describe-config | grep -o 'unix_socket_director\w*'
Randall

Réponses:


25

J'ai piraté le problème en exécutant (en tant que 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

Exécutez pg_upgradecomme prévu, puis annulez le hack:

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

Le problème est que pg_upgrade exécute le programme pg_ctrl avec des arguments qui spécifient des fichiers dans l'ancien "unix_socket_directory" plutôt que le nouveau "unix_socket_directories" (notez que le second est pluriel). Ce hack renomme l'original /usr/bin/pg_ctlen /usr/bin/pg_ctl-orig, puis crée un script shell à sa place qui appelle simplement le programme pg_ctl d'origine, en passant tous les arguments avec toutes les chaînes "unix_socket_directory" changé en "unix_socket_directories".

En bash, on peut changer une partie d'une chaîne, disons de barà bazdans une variable $foo, en utilisant ${foo/bar/baz}(notez que cela ne change pas la variable, mais renvoie plutôt le contenu modifié de la variable). Les tableaux peuvent également être utilisés avec ${x/y/z}pour récupérer un tableau avec tout son contenu remplacé, en une seule fois. La variable $@est un tableau qui contient tous les arguments passés au programme / script / fonction, donc le nouveau script pg_ctl exécute l'ancien avec tous les arguments changés de l'ancien nom de répertoire au nouveau.


3
cela m'a vraiment permis de mettre à niveau postgres 9.2 à 9.6 sur Centos 7! Merci!
sunsetjunks

2
A très bien fonctionné pour moi, passant de 9.2 à 9.6. Merci beaucoup! Aucune idée de ce que j'aurais fait sans cette réponse!
SebK

A aussi fonctionné pour moi, passant de 9.2 à 9.6 sur Centos 7
Gabriel Theron

1
Peut-être que l'explication de la ruse du hack bash pourrait aider d'autres personnes à faire face à des problèmes similaires à l'avenir. Ceci est une sérieuse torsion bash :-)
xor007

Solution excellente et élégante, fonctionnant parfaitement pour passer de PostgreSQL 9.2 à 10.7 sur CentOS 7
wfgeo

5

J'ai le même problème. Je passais de Fedora Repo 9.2.4 à PGDG 9.3. La source du problème est que Fedora rétroporte les modifications de paramètres unix_socket_directoryvers unix_socket_directories(voir https://bugzilla.redhat.com/show_bug.cgi?id=853353 ).

Ma solution est de reconstruire les pg_upgradesources, avec mise à jour dans un fichier contrib/pg_upgrade/server.c:199pg_upgradevérifie la version du serveur:

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

, dans mon cas, je le change en:

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

(voir mon fichier patch ici ).


Pourriez-vous s'il vous plaît expliquer pourquoi cela résout le problème (à des gens comme moi, qui ne connaissent pas trop les sources (méfiez-vous de l'euphémisme!))?
dezso

4
Comme par commentaire @a_horse ci - dessus, PostgreSQL en amont ont changé le paramètre unix_socket_directoryà unix_socket_directoriesla version 9.3. Mais le mainteneur de Fedora le rétroporte en version inférieure. Donc, pg_upgradede PGDG (PostgreSQL Global Development Group), YUM Repository s'attend à ce que la version 9.2.4 accepte unix_socket_directory, mais en fait le 9.2.4 de Fedora YUM Repository accepte unix_socket_directories. Dans ce cas, comme Fedora le rétroporte dans la version 9.0, je l'ai changé pour l'utiliser unix_socket_directoriespour la version> = 9.0.
Ali Akbar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.