Comment résoudre un «décalage de version de serveur» avec pg_dump lorsque j'ai besoin des DEUX serveurs PostgreSQL installés?

13

J'ai installé deux serveurs PostgreSQL sur mon ordinateur. L'un est 9,1 et l'autre est 9,3. J'ai besoin que les deux serveurs soient installés.

Cependant, lorsque j'exécute pg_dump, j'obtiens une erreur de non-concordance de version:

server version: 9.3.6; pg_dump version: 9.1.15
pg_dump: aborting because of server version mismatch

Comment puis-je le résoudre? (Impossible de désinstaller l'une ou l'autre version - j'ai installé le 9.1 en premier et le 9.3 plusieurs mois plus tard - j'ai besoin que les deux serveurs de base de données soient installés).

Luis Masuelli
la source
Exécutez explicitement la version 9.3 de pg_dump. Les deux sont installés, mais un seul est la valeur par défaut. Voir update-alternativespour les chemins, ou dpkg -Lle package client postgresql pour voir où ils se trouvent. N'ayez pas immédiatement accès à une boîte Ubuntu pour vous montrer moi-même.
Craig Ringer
Ne peux pas. La commande pg_dump est exécutée à partir d'une autre application.
Luis Masuelli
Vous devrez alors modifier la PATHvariable d'environnement avec laquelle l'application s'exécute.
Craig Ringer
J'ai eu le même problème. J'ai dû installer via le référentiel apt de PostgreSQL: askubuntu.com/a/831293/448857
neoneye

Réponses:

16

TL; DR : si les deux instances PostgreSQL sont gérées par les packages Ubuntu (comme il se doit), utilisez simplement l' --clusteroption pour sélectionner l'instance PostgreSQL à sauvegarder, et il choisira automatiquement la version correspondante de pg_dump:

pg_dump --cluster 9.1/main [other pg_dump options]

ou

pg_dump --cluster 9.3/main [other pg_dump options].

mainest juste une valeur par défaut, exécutez pg_lsclusterspour voir vos noms réels dans la Clustercolonne.

Comment cela fonctionne: tel qu'installé par les packages Ubuntu, /usr/bin/pg_dumpest en fait un lien logiciel vers /usr/share/postgresql-common/pg_wrapper, dont le but est précisément de sélectionner l'instance correcte et d'exécuter le binaire correspondant. --clustern'existe pas dans les commandes PostgreSQL, c'est un ajout Debian / Ubuntu qui est destiné à résoudre ce problème de versions / chemins multiples.

C'est la même pour psql, createdb, createuser, etc. environ 18 commandes de Postgres en /usr/binsont effectivement gérés par pg_wrapper.

Voir man pg_wrapper pour plus.

Daniel Vérité
la source
à quoi sert la version / main? quel est le principal?
Alexander Mills
1
@AlexanderMills: version= version principale de postgresql et main= nom par défaut du cluster. Voir les pages de manuel de pg_lsclusters et pg_wrapper.
Daniel Vérité
7

Vous pouvez utiliser:

sudo find / -name pg_dump

pour trouver vos versions de pg_dumpdans mon cas:/usr/pgsql-9.6/bin/pg_dump

nous pouvons ensuite faire:

sudo ln -sfn /usr/pgsql-9.6/bin/pg_dump /usr/bin/pg_dump

afin de mettre à jour celui dont nous avons besoin

edilio
la source