Cómo ejecutar una versión específica (8.4, 9.1) del comando postgresql pg_ * (por ejemplo, pg_dump)

11

Tengo instaladas las versiones 8.4 y 9.1 de Postgresql. Para cualquier comando Postgresql dado, ¿cómo especifico una versión específica del comando para ejecutar? (por ejemplo, psql, pg_dump, pg_ctlcluster, pg_restore, ...)

Mi pregunta está motivada por querer hacer un pg_dump en preparación para una actualización de 8.4 a 9.1, y quiero saber qué versión de pg_dump estoy ejecutando.

Estoy corriendo en Ubuntu 10.04 Natty.

Rob Bednark
fuente

Respuestas:

15

Estás en Ubuntu y obviamente tienes pg_wrapperinstalado Martin Pitt (a juzgar por pg_ctlcluster) que es proporcionado por el paquete postgresql-commony viene con los paquetes estándar de Debian. Yo uso lo mismo en Debian .

En un sistema Linux, ejecute whichen el shell para ver qué ejecutable se elige realmente:

postgres@db:~$ which pg_dump
/usr/bin/pg_dump
postgres@db:~$ ls -l /usr/bin/pg_dump
lrwxrwxrwx 1 root root 37  4. Jun 18:57 /usr/bin/pg_dump -> ../share/postgresql-common/pg_wrapper

pg_dumpes en realidad un enlace simbólico a pg_wrapper, que selecciona dinámicamente la versión adecuada del programa cliente para el clúster db con el que se ejecuta pg_dump. Cito la página de manual de pg_wrapper:

Este programa se ejecuta solo como un enlace a nombres que corresponden a programas PostgreSQL en / usr / lib / postgresql / version / bin. Determina el clúster y la base de datos configurados para el usuario y llama a la versión adecuada del programa deseado para conectarse a ese clúster y base de datos, proporcionando las opciones especificadas a ese comando.

   The target cluster is selected by the following means, in descending order of precedence:
   1.  explicit specification with the --cluster option
   2.  explicit specification with the PGCLUSTER environment variable
   3.  matching entry in ~/.postgresqlrc (see postgresqlrc(5)), if that file exists
   4.  matching entry in /etc/postgresql-common/user_clusters (see user_clusters(5)), if that file exists
   5.  If only one local cluster exists, that one will be selected.
   6.  If several local clusters exist, the one listening on the default port 5432 will be selected.

   If none of these rules match, pg_wrapper aborts with an error.

IOW, la versión correcta debe elegirse automáticamente, a menos que haya estropeado su instalación de alguna manera. Siempre puede agregar la opción --clusterpara ser específico.

Erwin Brandstetter
fuente
1
Solo una nota: esto no ayuda con las conexiones remotas. Tengo instaladas las herramientas de cliente 8.3 y 9.1 y el valor predeterminado es 8.3 por alguna razón. Tengo que seleccionar manualmente la ruta en / usr / lib para usar la versión correcta. Pensé que el más nuevo se usaría por defecto, pero parece que no.
Sami Kuhmonen
No necesita el más nuevo, sino el que coincida con su base de datos. Sin embargo, para algunos propósitos, la nueva versión de pg_dump puede ser la mejor opción.
Erwin Brandstetter
¿Puede aclarar qué necesita exactamente ir en el archivo ~ / .postgreslqrc? Salida de mi cliente -> psql (8.4.21, servidor 9.1.13) ADVERTENCIA: psql versión 8.4, servidor versión 9.1. Algunas características de psql podrían no funcionar.
Croydon Dias
Eso no parece funcionar para mí. Creé un volcado en un servidor con 9.1, y cuando intenté restaurar en otro servidor con 9.1 y 8.4, me dice que no puede reconocer el formato del archivo. Además, no hay --clusteropción de línea de comando.
Alexis Wilke
4

yo suelo

PGCLUSTER=8.4/main pg_dump ...
PGCLUSTER=9.1/main pg_dump ...
Gavriel
fuente