Estou usando pg_dump / pg_restore para fazer backup e restaurar um banco de dados PostgreSQL, mas estou recebendo algumas mensagens de erro (e um status de saída diferente de zero) do pg_restore. Eu tentei um caso básico super simples (descrito abaixo), mas ainda assim tenho esses erros:
pg_restore: [archiver (db)] Erro ao processar o sumário: pg_restore: [archiver (db)] Erro da entrada 5 do TOC; 2615 2200 SCHEMA postgres públicos pg_restore: [archiver (db)] não pôde executar a consulta: ERRO: o esquema "público" já existe O comando foi: CREATE SCHEMA public;
Passos para reproduzir:
- Instale uma nova distro de baunilha do Ubuntu 14.04 (estou usando o Vagrant com esta caixa do Vagrant ).
- Instale o PostgreSQL 9.3, configure para permitir conexões locais como usuário do PostgreSQL "postgres" de qualquer usuário do Linux.
Crie um banco de dados de teste. Eu estou apenas fazendo:
vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres postgres psql (9.3.5) Digite "ajuda" para obter ajuda. postgres = # cria banco de dados mydb; CRIAR BASE DE DADOS postgres = # \ q vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres mydb psql (9.3.5) Digite "ajuda" para obter ajuda. mydb = # cria dados da tabela (entrada bigint); CRIAR A TABELA mydb = # insere valores de dados (1); INSERIR 0 1 mydb = # insere valores de dados (2); INSERIR 0 1 mydb = # insere valores de dados (3); INSERIR 0 1 mydb = # \ q
Crie um backup do banco de dados da seguinte forma:
PGPASSWORD = "postgres" pg_dump --dbname = mydb --username = postgres --format = customizado> pg_backup.dump
Exclua algumas linhas da tabela de dados em mydb para podermos saber se restauramos os dados com êxito.
Restaure o banco de dados com:
PGPASSWORD = "postgres" pg_restore --clean --create --dbname = postgres --username = postgres pg_backup.dump
Os dados são restaurados, mas o comando pg_restore na etapa 6 sai com status 1
e mostra a seguinte saída:
pg_restore: [archiver (db)] Erro ao processar o sumário: pg_restore: [archiver (db)] Erro da entrada 5 do TOC; 2615 2200 SCHEMA postgres públicos pg_restore: [archiver (db)] não pôde executar a consulta: ERRO: o esquema "público" já existe O comando foi: CREATE SCHEMA public; AVISO: erros ignorados na restauração: 1
Não posso simplesmente ignorar isso porque estou executando este comando programaticamente e preciso usar o status de saída para determinar se a restauração falhou ou não. Inicialmente, eu me perguntava se esse problema era porque eu coloquei meu banco de dados em público (o esquema padrão). Eu raciocinei que o público seria criado como resultado da --create
opção pelo pg_restore antes da restauração dos dados (o que poderia tentar criar esse esquema também, pois é onde está minha tabela), mas quando tentei as etapas acima com minha tabela em um esquema diferente, os resultados eram os mesmos e as mensagens de erro eram idênticas.
Estou fazendo algo errado? Por que estou vendo esse erro?
fonte
--create
semclean
não resolve o problema.No meu caso, o motivo foi que eu estava usando o
pg_restore
postgresql-contrib versão 11.2 para restaurar um dump feito pelopg_dump
9.6 para um cluster do PostgreSQL 9.6.Depois de
pg_restore
voltar para a 9.6, esseschema "public" already exists
erro desapareceu e o processo de restauração funcionou como antes.fonte