Como executar a versão específica (8.4, 9.1) do comando postgresql pg_ * (por exemplo, pg_dump)

11

Eu tenho o Postgresql versões 8.4 e 9.1 instaladas. Para qualquer comando Postgresql, como especifico uma versão específica do comando a ser executado? (por exemplo, psql, pg_dump, pg_ctlcluster, pg_restore, ...)

Minha pergunta é motivada por querer fazer um pg_dump em preparação para uma atualização da 8.4 para a 9.1, e quero saber qual versão do pg_dump estou executando.

Estou executando o Ubuntu 10.04 Natty.

Rob Bednark
fonte

Respostas:

15

Você está no Ubuntu e obviamente possui o Martin Pitt pg_wrapperinstalado (a julgar por pg_ctlcluster) que é fornecido pelo pacote postgresql-commone vem com os pacotes padrão do Debian. Eu uso o mesmo no Debian .

Em um sistema Linux, execute whichno shell para ver qual executável é realmente escolhido:

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_dumpé na verdade um link simbólico para pg_wrapper, que escolhe dinamicamente a versão apropriada do programa cliente para o cluster db com o qual você executa pg_dump. Cito a página de manual de pg_wrapper:

Este programa é executado apenas como um link para nomes que correspondem aos programas do PostgreSQL em / usr / lib / postgresql / version / bin. Ele determina o cluster e o banco de dados configurados para o usuário e chama a versão apropriada do programa desejado para conectar-se a esse cluster e banco de dados, fornecendo as opções especificadas para esse 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, a versão correta deve ser escolhida automaticamente, a menos que você estrague sua instalação de alguma forma. Você sempre pode adicionar a opção --clusterpara ser específico.

Erwin Brandstetter
fonte
1
Apenas uma observação: isso não ajuda com conexões remotas. Eu tenho as ferramentas cliente 8.3 e 9.1 instaladas e o padrão é 8.3 por algum motivo. Eu tenho que selecionar manualmente o caminho em / usr / lib para usar a versão correta. Eu pensaria que o mais novo seria usado por padrão, mas parece que não.
Sami Kuhmonen 28/03
Você não precisa do mais novo, mas do que corresponde ao seu banco de dados. Para alguns propósitos, a nova versão do pg_dump pode ser a melhor opção.
Erwin Brandstetter 28/03
Você pode esclarecer o que exatamente precisa estar no arquivo ~ / .postgreslqrc? Saída do meu cliente -> psql (8.4.21, servidor 9.1.13) AVISO: psql versão 8.4, versão do servidor 9.1. Alguns recursos do psql podem não funcionar.
Croydon Dias
Isso não parece funcionar para mim. Criei um despejo em um servidor com 9.1 e, quando tentei restaurar em outro servidor com 9.1 e 8.4, ele me disse que não podia reconhecer o formato do arquivo. Além disso, não há --clusteropção de linha de comando.
Alexis Wilke
4

eu uso

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