
Instalé dos servidores PostgreSQL en mi computadora. Uno es 9.1 y el otro es 9.3. Necesito ambos servidores instalados.
Sin embargo, cuando ejecuto pg_dump, aparece un error de no coincidencia de versiones:
server version: 9.3.6; pg_dump version: 9.1.15
pg_dump: aborting because of server version mismatch
¿Cómo puedo resolverlo? (No puedo desinstalar ninguna de las versiones; instalé la 9.1 primero y la 9.3 muchos meses después; necesitoambosservidores de bases de datos instalados).
Respuesta1
TL;DR: si ambas instancias de PostgreSQL son administradas por los paquetes de Ubuntu (como deberían), simplemente use la --cluster
opción para seleccionar la instancia de PostgreSQL para realizar la copia de seguridad y automáticamente elegirá la versión correspondiente de pg_dump:
pg_dump --cluster 9.1/main [other pg_dump options]
o
pg_dump --cluster 9.3/main [other pg_dump options]
.
main
es solo un valor predeterminado, ejecútelo pg_lsclusters
para ver sus nombres reales en la Cluster
columna.
Cómo funciona: tal como lo instalan los paquetes de Ubuntu, /usr/bin/pg_dump
es en realidad un enlace suave a /usr/share/postgresql-common/pg_wrapper
, cuyo propósito es precisamente seleccionar la instancia correcta y ejecutar el binario correspondiente. --cluster
no existe en los comandos estándar de PostgreSQL, es una adición de Debian/Ubuntu que está destinada a abordar este problema de múltiples versiones/múltiples rutas.
Esto es lo mismo para psql
, createdb
, createuser
, etc. En /usr/bin
realidad, alrededor de 18 comandos de Postgres son administrados por pg_wrapper
.
Verhombre pg_wrapperpara más.
Respuesta2
Puedes usar:
sudo find / -name pg_dump
para encontrar sus versiones de pg_dump
en mi caso:/usr/pgsql-9.6/bin/pg_dump
entonces lo siguiente que podemos hacer:
sudo ln -sfn /usr/pgsql-9.6/bin/pg_dump /usr/bin/pg_dump
para actualizar al que necesitamos
Respuesta3
Si está ejecutando Docker, puede ejecutar cualquier versión de pg_dump sin tener que administrar múltiples instalaciones. Esto escribirá un archivo /path/to/dump/to/myfilename.dump
usando postgres 12.5:
docker run --rm --network=host -v "/path/to/dump/to:/tmp/dump" \
postgres:12.5 pg_dump -Fc -v --dbname="my_db_bame" -f "/tmp/dump/myfilename.dump"
--rm
elimina el contenedor cuando finaliza el comando--network=host
conecta el contenedor a la red local del host-v ...
monta su directorio de host (/path/to/dump/to
) en un directorio temporal dentro del contenedor
Solo debe asegurarse de que el directorio en el que monta ( /tmp/dump
) sea el mismo que el directorio en el que escribe pg_dump.
Luego puedes cambiar 12.5 a la versión que quieras.