Incompatibilidade de versão do PostgreSQL 9.2 pg_dump


141

Estou tentando despejar um banco de dados Postgresql usando a ferramenta pg_dump .

$ pg_dump books > books.out

Como sempre estou recebendo esse erro.

pg_dump: server version: 9.2.1; pg_dump version: 9.1.6
pg_dump: aborting because of server version mismatch

A --ignore-versionopção agora está obsoleta e realmente não seria uma solução para o meu problema, mesmo que tivesse funcionado.

Como posso atualizar o pg_dump para resolver esse problema?


Respostas:


27

Você pode instalar o PostgreSQL 9.2.1 na pg_dumpmáquina cliente ou apenas copiá-lo $PGHOMEda máquina servidor do PostgreSQL para a máquina cliente. Observe que não há necessidade de initdbum novo cluster na máquina cliente.

Depois de concluir a instalação do software 9.2.1, lembre-se de editar algumas variáveis ​​de ambiente em seu .bash_profilearquivo.


75

Eu encontrei isso ao usar o Heroku no Ubuntu, e aqui está como eu o corrigi:

  1. Adicione o repositório apt do PostgreSQL conforme descrito em " Downloads do Linux (Ubuntu) ". (Existem páginas semelhantes para outros sistemas operacionais.)

  2. Atualize para a versão mais recente (9.3 para mim) com:

    sudo apt-get install postgresql
  3. Recrie o link simbólico /usr/bincom:

    sudo ln -s /usr/lib/postgresql/9.3/bin/pg_dump /usr/bin/pg_dump --force

    O número da versão no /usr/lib/postgresql/...caminho acima deve corresponder ao server versionnúmero no erro que você recebeu. Portanto, se o seu erro indicar, pg_dump: server version: 9.9vincule-o a /usr/lib/postgresql/9.9/....


Isso só acontece quando você atualiza o PostgreSQL. Acabei de fazer uma nova instalação do sistema operacional e não tive nenhum problema com isso.
Seth

Para quem se pergunta, esta solução também se aplica ao Ubuntu não-Heroku.
31560 Ian McLaren

2
De acordo com o que foi dito nesta resposta , também é uma péssima ideia.
Arthur

Essa resposta recomenda remover o software excluindo uma pasta. Aqui estamos apenas recriando um link simbólico.
Seth

2
Perfeito! Recriando o link simbólico após postgres atualizar
Yo Ludke

61
  1. Verifique as versões instaladas do pg_dump:

    find / -name pg_dump -type f 2>/dev/null
  2. Minha saída foi:

    /usr/pgsql-9.3/bin/pg_dump
    /usr/bin/pg_dump
  3. Existem duas versões instaladas. Para atualizar o pg_dump com a versão mais recente:

    sudo ln -s /usr/pgsql-9.3/bin/pg_dump /usr/bin/pg_dump --force

Isso criará o link simbólico para a versão mais recente.


2
Foi muito mais rápido para mim encontrar as versões usandolocate pg_dump
Obromios

1
IMO, você não deve adicionar, 2>/dev/nullpois isso descartará o fluxo de ERRO em vez de imprimi-lo no console. Eu acho que se deve querer ver algum erro acontecendo, exceto alguns casos raros. Por exemplo, no meu caso, isso me lembra que eu não era root, deixando de ver alguns diretórios em que a versão mais recente do pg_dump foi instalada. Em geral, não remova erros.
Poutrathor

40

Macs têm um /usr/bin/pg_dumpcomando interno que é usado como padrão.

Com a instalação do postgresql, você obtém outro binário em /Library/PostgreSQL/<version>/bin/pg_dump


3
A localização varia de acordo com a instalação do PostgreSQL (instalador do EnterpriseDB, MacPorts, Homebrew, etc.), mas a essência da resposta - que o usuário provavelmente já possui a versão correta - está certa.
Craig campainha

3
No meu caso, abrir .bash_profile e adicionar "export PATH = / Applications / Postgres.app / contents / macos / bin: $ PATH" fez a mágica.
11118 Alex Weber

29

Você pode apenas localizar pg_dumpe usar o caminho completo no comando

locate pg_dump

/usr/bin/pg_dump
/usr/bin/pg_dumpall
/usr/lib/postgresql/9.3/bin/pg_dump
/usr/lib/postgresql/9.3/bin/pg_dumpall
/usr/lib/postgresql/9.6/bin/pg_dump
/usr/lib/postgresql/9.6/bin/pg_dumpall

Agora basta usar o caminho da versão desejada no comando

/usr/lib/postgresql/9.6/bin/pg_dump books > books.out

1
Para usuários do CentOS (minha versão é 6.9 Final):sudo /usr/pgsql-<version>/bin/pg_dump <database-name> -U <username> -h localhost
Davidson Lima

@ jDub9 que versão você usou ao fazer o despejo? Certifique-se de que você está usando o mesmo
Deepak Mahakale 28/06/19

16

Se você estiver no Ubuntu, poderá ter uma versão antiga do postgresql-clientinstalada. Com base nas versões da sua mensagem de erro, a solução seria a seguinte:

sudo apt-get remove postgresql-client-9.1
sudo apt-get install postgresql-client-9.2

11

Sempre que você atualiza ou reinstala uma nova versão do PostgreSQL, uma versão mais recente pg_dump é instalada.

Deve haver um PostgreSQL/bin diretório em algum lugar do seu sistema, na versão mais recente do PostgreSQL que você instalou (9.2.1 é a mais recente) e tente executar a pg_dump partir de lá.


10
Dica: in Terminal.app,find / -name pg_dump -type f 2>/dev/null
Craig Ringer

8

Para aqueles que executam o Postgres.app :

  1. Adicione o seguinte código ao seu .bash_profile:

    export PATH=/Applications/Postgres.app/Contents/Versions/latest/bin:$PATH
  2. Reinicie o terminal.


7

Para Macs com Homebrew. Eu tive esse problema ao buscar o db do Heroku. Corrigi-o apenas em execução:

brew upgrade postgresql

6

Para usuários de mac, coloque no topo do arquivo .profile.

export PATH="/Applications/Postgres.app/Contents/MacOS/bin:$PATH"

então corra

. ~/.profile


3

Como explicado, isso ocorre porque o seu postgresql está na versão antiga -> atualize-o para Mac via homebrew:

brew tap petere/postgresql,

brew install <formula>(por exemplo brew install petere/postgresql/postgresql-9.6:)

Remova o postgre antigo:

brew unlink postgresql

brew link -f postgresql-9.6

Se ocorrer algum erro, não se esqueça de ler e seguir as instruções de preparação em cada etapa.

Verifique isso para mais: https://github.com/petere/homebrew-postgresql


3

Uma resposta alternativa que eu acho que ninguém mais cobriu.

Se você tiver vários clusters PG instalados (como eu), poderá visualizá-los pg_lsclusters.

Você poderá ver a versão e o cluster na lista exibida.

A partir daí, você pode fazer o seguinte:

pg_dump --cluster=9.6/main books > books.out

Obviamente, substitua a versão e o nome do cluster pelo apropriado para suas circunstâncias do que é retornado, pg_lsclustersseparando a versão e o cluster por um /. Isso tem como alvo o cluster específico no qual você deseja executar.


1
Isso é muito útil. Como eu estava confuso, por que pg_dumpnão estava trabalhando em um dos meus clusters? Acontece que ele estava usando a versão padrão do Postgresql, quando um dos meus clusters foi atualizado para uma versão mais recente. Especificando cluster, resolveu o problema.
Andrius

3

Para mim, o problema da atualização psql apt-getnão estava resolvendo as versões mais recentes, mesmo depois update. O seguinte funcionou.

Ubuntu

Comece com a importação da chave GPG para pacotes PostgreSQL.

sudo apt-get install wget ca-certificates
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

Agora adicione o repositório ao seu sistema.

sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'

Instale o PostgreSQL no Ubuntu

sudo apt-get update
sudo apt-get install postgresql postgresql-contrib

https://www.postgresql.org/download/linux/ubuntu/


1
Isso não substituirá os arquivos executáveis ​​existentes no seu computador; portanto, você precisará usar explicitamente a nova versão do pg_dump, por exemplo, /usr/lib/postgresql/9.6/bin/pg_dump ou criar um novo atalho, por exemplo, / usr / bin / pg_dump96
vinh

Eu não tive que usar explicitamente o novo que ele pegou.
rado

2

Se você tiver o docker instalado, poderá fazer algo como:

$ docker run postgres:9.2 pg_dump books > books.out

Isso fará o download do contêiner Docker com o Postgres 9.2, será executado pg_dumpdentro do contêiner e gravará a saída.


2

A resposta parece boba, mas se você receber o erro acima e quiser executar o pg_dump para a versão anterior, vá para o diretório bin do postgres e digite

./pg_dump servername> out.sql ./ ignora a raiz e procura pg_dump no diretório atual


2

Eu tive o mesmo erro e foi assim que o resolvi no meu caso. Isso significa que sua versão do postgresql é 9.2.1, mas você iniciou o serviço postgresql da 9.1.6.

Se você executar psql postgres, verá:

psql (9.2.1, server 9.1.6)

O que eu fiz para resolver esse problema é:

  1. brew services stop postgresql@9.1.6
  2. brew services restart postgresql@9.2.1

Agora execute psql postgrese você deve ter:psql (9.2.1)

Você também pode executar brew services listpara ver o status do seu postgres.


1

** após a instalação, a versão do postgres é correspondida (9.2) Crie um link simbólico ou novo atalho

** - em '/ usr / bin'

syntag is = sudo ln -s [path for use] [new shortcut name]

exemplo

sudo ln -s /usr/lib/postgresql/9.2/bin/pg_dump new_pg_dump

- como chamar: new_pg_dump -h 192.168.9.88 -U postgres database



1

Se o banco de dados estiver instalado em uma máquina diferente, é provável que tenha a versão correta do pg_dump instalada. Isso significa que você pode executar o comando pg_dump remotamente com o SSH: ssh username@dbserver pg_dump books > books.out

Você também pode usar a autenticação de chave pública para execução sem senha. Passos para conseguir isso:

  1. Gere (se ainda não tiver sido concluído) um par de chaves com o comando ssh-keygen.
  2. Copie a chave pública para o servidor de banco de dados, geralmente ~ / .ssh / allowed_keys.
  3. Teste se a conexão funciona com o comando ssh.

1

Bem, eu tive o mesmo problema, pois tenho duas versões do postgress instaladas.

Basta usar o pg_dump adequado e você não precisa alterar nada, no seu caso:

 $> /usr/lib/postgresql/9.2/bin/pg_dump books > books.out

0

Se você estiver usando o Postgres.app do Heroku, o pg_dump (junto com todos os outros binários) estará em /Applications/Postgres.app/Contents/MacOS/bin/

então nesse caso é

ln -s /Applications/Postgres.app/Contents/MacOS/bin/pg_dump /usr/local/bin/pg_dump

ou

ln -s /Applications/Postgres.app/Contents/MacOS/bin/* /usr/local/bin/.

agarrar todos eles


0

Para macs, use find / -name pg_dump -type f 2>/dev/nullencontrar o local de pg_dump

Para mim, tenho os seguintes resultados:

Applications/Postgres.app/Contents/Versions/9.5/bin/pg_dump
/usr/local/Cellar/postgresql/9.4.5_2/bin/pg_dump

Se você não quiser usar sudo ln -s new_pg_dump old_pg_dump --force, basta usar:

Applications/Postgres.app/Contents/Versions/9.5/bin/pg_dumpsubstituir pg_dumpno seu terminal

Por exemplo:

Applications/Postgres.app/Contents/Versions/9.5/bin/pg_dump books > books.out

Funciona para mim!


0

Faça o download da versão apropriada do postgres aqui:

https://www.postgresql.org/download/

Certifique-se de executar os seguintes comandos (a URL postgresql.org/download irá gerar a URL específica para você usar; a que eu uso abaixo é apenas um exemplo para o centos 7) como sudo:

sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install postgresql11-server

sua versão do pg_dump agora deve ser atualizada, verifique com pg_dump -V


-6

Eu tive um problema semelhante na minha instalação do Fedora 17. Foi isso que fiz para contornar o problema

  • Exclua o built-in pg_dumpem /usr/bin/pg_dump(como root: "rm / usr / bin / pg_dump")
  • Agora faça um link simbólico da instalação do postgresql

    Novamente como root ln -s /usr/pgsql-9.2/bin/pg_dump /usr/bin/pg_dump

Isso deve fazer o truque


9
Nonono, não exclua apenas arquivos gerenciados por pacotes! Se estiver dentro /usr/( em vez de /usr/local/, /home/ou /opt/, onde excluir coisas geralmente está OK), você realmente precisa usar o gerenciador de pacotes - rpm& yumou dpkge / apt-getou aptitude, dependendo da distribuição. Desinstale o pacote rpmou altere sua PATHvariável de ambiente na sua, .bash_profilepara que a versão mais recente seja encontrada primeiro. Se você estiver em dúvida sobre algo estar sob a gestão de pacotes, uso rpm -qf /path/to/file(RPM) ou dpkg -S /path/to/file(dpkg)
Craig Ringer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.