Estou tentando fazer backup e restaurar um esquema de um servidor remoto para um sistema local. Embora pg_dump
e pg_restore
relate a mesma versão, o último falha com o familiar erro "Versão não suportada" (log abaixo). Já vi esse erro antes, quando pg_restore
é uma versão mais antiga que pg_dump
, mas nunca quando as versões correspondem. O que poderia ser a causa?
$ psql -h server.somewhere -p 5432 -U user -d database
Password for user user:
psql (16.1 (Ubuntu 16.1-1.pgdg22.04+1), server 14.10)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
database=> SELECT version();
version
----------------------------------------------------------------------------------------------------------
PostgreSQL 14.10 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-20), 64-bit
(1 row)
database=> \q
$ pg_dump --version
pg_dump (PostgreSQL) 14.10 (Ubuntu 14.10-1.pgdg22.04+1)
$ pg_restore --version
pg_restore (PostgreSQL) 14.10 (Ubuntu 14.10-1.pgdg22.04+1)
$ pg_dump -h server.somewhere -p 5432 -U user database -n schema_new -F t > ~/temp/schema_new_2024-01-29.backup
$ pg_restore -d wosis ~/temp/schema_new_2024-01-29.backup
pg_restore: error: unsupported version (1.15) in file header
O Ubuntu permite múltiplas versões instaladas das ferramentas cliente PostgreSQL e seleciona dinamicamente a versão em tempo de execução de acordo com a regra de 8 etapas explicada na página de manual pg_wrapper :
Presumivelmente, o que acontece aqui é que você tem as versões 14 e 16 das ferramentas cliente instaladas e um servidor PostgreSQL local versão 14.
Portanto, quando você executa "pg_dump --version" ou "pg_restore" em um servidor local, presume-se que você deseja a versão 14.
Mas quando você faz "pg_dump -h some-remote-server" ele não sabe qual versão é o servidor de destino, então ele usa a versão mais recente, versão 16. Então você está dumping com a versão 16 e recarregando com a versão 14, que não é suportado.
Para evitar isso, existem várias soluções configurando ou adicionando opções de linha de comando, mas a mais simples é invocar diretamente a versão desejada, por exemplo, em vez
/usr/lib/postgresql/16/bin/pg_dump
depg_dump
.Você também pode desinstalar as versões que não deseja, embora possa se deparar com problemas de dependências e atualizações futuras possam querer instalá-las novamente. Os pacotes são nomeados
postgresql-client-NN
.