AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 90258
Accepted
KSletmoe
KSletmoe
Asked: 2015-01-27 18:02:33 +0800 CST2015-01-27 18:02:33 +0800 CST 2015-01-27 18:02:33 +0800 CST

pg_restore: [archiver (db)] não pôde executar a consulta: ERRO: o esquema "público" já existe

  • 772

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 base super simples (descrito abaixo), mas ainda recebi esses erros:

pg_restore: [archiver (db)] Erro ao PROCESSAR TOC:
pg_restore: [archiver (db)] Erro da entrada 5 do TOC; 2615 2200 SCHEMA postgres público
pg_restore: [archiver (db)] não pôde executar a consulta: ERRO: o esquema "público" já existe
    O comando era: CREATE SCHEMA public;

Passos para reproduzir:

  1. Instale uma nova distribuição do Ubuntu 14.04 (estou usando o Vagrant com esta caixa do Vagrant ).
  2. Instale o PostgreSQL 9.3, configure para permitir conexões locais como usuário PostgreSQL "postgres" de qualquer usuário Linux.
  3. Crie um banco de dados de teste. 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 BANCO 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(entry bigint);
    CRIAR A TABELA
    mydb=# inserir em valores de dados(1);
    INSERIR 0 1
    mydb=# inserir em valores de dados(2);
    INSERIR 0 1
    mydb=# inserir em valores de dados(3);
    INSERIR 0 1
    meudb=# \q
    
  4. Crie um backup do banco de dados assim:

    PGPASSWORD="postgres" pg_dump --dbname=mydb --username=postgres --format=custom > pg_backup.dump
  5. Exclua algumas linhas da tabela de dados em mydb para que possamos saber se restauramos os dados com sucesso.

  6. 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 1e mostra a seguinte saída:

pg_restore: [archiver (db)] Erro ao PROCESSAR TOC:
pg_restore: [archiver (db)] Erro da entrada 5 do TOC; 2615 2200 SCHEMA postgres público
pg_restore: [archiver (db)] não pôde executar a consulta: ERRO: o esquema "público" já existe
    O comando era: CREATE SCHEMA public;



AVISO: erros ignorados na restauração: 1

Não posso simplesmente ignorar isso porque estou executando esse comando programaticamente e preciso usar o status de saída para determinar se a restauração falhou ou não. Inicialmente, me perguntei se esse problema era porque coloquei meu banco de dados em público (o esquema padrão). Eu raciocinei que public seria criado como resultado da --createopção por pg_restore antes que os dados fossem restaurados (o que poderia tentar criar esse esquema também, já que é onde está minha tabela), mas quando tentei as etapas acima com minha tabela em um esquema diferente, os resultados foram os mesmos e as mensagens de erro foram idênticas.

Estou fazendo algo errado? Por que estou vendo esse erro?

postgresql backup
  • 6 6 respostas
  • 87977 Views

6 respostas

  • Voted
  1. Best Answer
    Daniel Vérité
    2015-01-28T08:17:18+08:002015-01-28T08:17:18+08:00

    O erro é inofensivo, mas para se livrar dele, acho que você precisa dividir essa restauração em dois comandos, como em:

    dropdb -U postgres mydb && \
     pg_restore --create --dbname=postgres --username=postgres pg_backup.dump
    

    A --cleanopção em pg_restore não parece muito, mas na verdade levanta problemas não triviais.

    Para versões até 9.1

    A combinação de --createe --cleannas opções do pg_restore costumava ser um erro nas versões mais antigas do PG (até 9.1). Há de fato alguma contradição entre (citando a página de manual 9.1):

    --clean Limpe (descarte) objetos de banco de dados antes de recriá-los

    e

    --create Cria o banco de dados antes de restaurá-lo.

    Porque qual é o sentido de limpar dentro de um banco de dados novinho em folha?

    A partir da versão 9.2

    A combinação agora é aceita e o documento diz isso (citando a página de manual 9.3):

    --clean Limpe (descarte) objetos de banco de dados antes de recriá-los. (Isso pode gerar algumas mensagens de erro inofensivas, se algum objeto não estiver presente no banco de dados de destino.)

    --create Cria o banco de dados antes de restaurá-lo. Se --clean também for especificado, descarte e recrie o banco de dados de destino antes de se conectar a ele.

    Agora, ter os dois juntos leva a esse tipo de sequência durante a restauração:

    DROP DATABASE mydb;
    ...
    CREATE DATABASE mydb WITH TEMPLATE = template0... [other options]
    ...
    CREATE SCHEMA public;
    ...
    CREATE TABLE...
    

    Não há DROPpara cada objeto individual, apenas um DROP DATABASEno início. Se não usar --createisso seria o oposto.

    De qualquer forma essa sequência gera o erro de publicesquema já existente porque criar mydbde template0já importou (o que é normal, é o ponto de um banco de dados de templates).

    Não sei por que esse caso não é tratado automaticamente pelo pg_restore. Talvez isso causaria efeitos colaterais indesejáveis ​​quando um administrador decide personalizar template0e/ou alterar a finalidade de public, mesmo que não devêssemos fazer isso.

    • 29
  2. Lu Liu
    2019-05-29T22:53:52+08:002019-05-29T22:53:52+08:00

    No meu caso, o motivo foi que eu estava usando pg_restorepostgresql-contrib versão 11.2 para restaurar um dump feito pelo pg_dump9.6 para um cluster PostgreSQL 9.6.

    Depois que fiz o downgrade pg_restorepara 9.6, esse schema "public" already existserro desapareceu e o processo de restauração funcionou como antes.

    • 12
  3. DaJudge
    2020-02-25T05:58:15+08:002020-02-25T05:58:15+08:00

    A restauração inclui o esquema público e também cria o banco de dados. Portanto, remova o esquema após criar o banco de dados para que a restauração possa criá-lo sem erros.

    Nota: A seguir, assume -se que -h -U -pé padrão e PGPASSWORDou .pgpassestá definido

        psql << XENDX
        drop database if exists DB_NAME;
        create database DB_NAME;
        \c DB_NAME;
        drop schema if exists public;
        create schema public;
        XENDX
        
        pg_restore -d DB_NAME FILE_CREATED_WITH_pg_dump
    
    • 4
  4. spume
    2021-01-08T10:13:16+08:002021-01-08T10:13:16+08:00

    No meu caso, consegui resolver esse problema primeiro executando CREATE DATABASE target_db;e depois executando pg_restorecom o --schema=public -d target_db. Isso pressupõe que você queira apenas o esquema público, mas acho que esse é um cenário bastante comum.

    • 3
  5. user9869932
    2020-02-17T14:10:42+08:002020-02-17T14:10:42+08:00

    Eu resolvi com:

    no db.sqlarquivo

    drop database if exists DB_name;
    create database DB_name;
    drop schema if exists public;
    create schema public;
    \q
    

    então

    PGPASSWOD=DB_pass psql -U DB_user -h 127.0.0.1 < db.sql
    

    E depois

    PGPASSWOD=DB_pass pg_restore -h 127.0.0.1 \ 
        -U DB_user -d DB_name --create --no-acl --no-owner DB_dump_FILE
    

    Minha versão do pg_restore é 11.6

    • 1
  6. Y Bai
    2021-06-17T17:50:21+08:002021-06-17T17:50:21+08:00

    Recebi os mesmos erros ao usar o pgsql-pg_restore da versão 12 para restaurar um despejo feito pelo pg_dump 9.6. Alterado para usar pg_restore versão 9, problema resolvido.

    • 0

relate perguntas

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve