pg_restore: [archiver (db)] non ha potuto eseguire la query: ERRORE: lo schema "pubblico" esiste già


17

Sto usando pg_dump / pg_restore per eseguire il backup e ripristinare un database PostgreSQL, ma sto ricevendo alcuni messaggi di errore (e uno stato di uscita diverso da zero) da pg_restore. Ho provato un caso di base super semplice (descritto di seguito) ma ho ancora questi errori:

pg_restore: [archiviatore (db)] Errore durante l'elaborazione del sommario:
pg_restore: [archiver (db)] Errore dalla voce TOC 5; 2615 2200 postgres pubblici SCHEMA
pg_restore: [archiver (db)] non ha potuto eseguire la query: ERRORE: lo schema "pubblico" esiste già
    Il comando era: CREATE SCHEMA public;

I passaggi per riprodurre:

  1. Installa una nuova distribuzione Ubuntu 14.04 alla vaniglia (sto usando Vagrant con questo box Vagrant ).
  2. Installa PostgreSQL 9.3, configura per consentire le connessioni locali come utente PostgreSQL "postgres" da qualsiasi utente Linux.
  3. Creare un database di prova. Sto solo facendo:

    vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres postgres
    psql (9.3.5)
    Digita "aiuto" per aiuto.
    
    postgres = # crea database mydb;
    CREA DATABASE
    postgres = # \ q
    vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres mydb
    psql (9.3.5)
    Digita "aiuto" per aiuto.
    
    mydb = # crea i dati della tabella (voce bigint);
    CREA TABELLA
    mydb = # inserisci nei valori dei dati (1);
    INSERISCI 0 1
    mydb = # inserisci nei valori dei dati (2);
    INSERISCI 0 1
    mydb = # inserisci nei valori dei dati (3);
    INSERISCI 0 1
    mydb = # \ q
    
  4. Creare un backup del database in questo modo:

    PGPASSWORD = "postgres" pg_dump --dbname = mydb --username = postgres --format = custom> pg_backup.dump
  5. Elimina alcune righe dalla tabella dei dati in mydb in modo da poter stabilire se i dati sono stati ripristinati correttamente.

  6. Ripristina il database con:

    PGPASSWORD = "postgres" pg_restore --clean --create --dbname = postgres --username = postgres pg_backup.dump

I dati vengono ripristinati, ma il comando pg_restore al passaggio 6 esce con stato 1e mostra il seguente output:

pg_restore: [archiviatore (db)] Errore durante l'elaborazione del sommario:
pg_restore: [archiver (db)] Errore dalla voce TOC 5; 2615 2200 postgres pubblici SCHEMA
pg_restore: [archiver (db)] non ha potuto eseguire la query: ERRORE: lo schema "pubblico" esiste già
    Il comando era: CREATE SCHEMA public;



ATTENZIONE: errori ignorati al ripristino: 1

Non posso semplicemente ignorarlo perché sto eseguendo questo comando a livello di codice e devo utilizzare lo stato di uscita per determinare se il ripristino non è riuscito o meno. Inizialmente, mi chiedevo se questo problema fosse dovuto al fatto di aver reso pubblico il mio database (lo schema predefinito). Ho pensato che il pubblico sarebbe stato creato come risultato --createdell'opzione da pg_restore prima che i dati fossero ripristinati (il che potrebbe plausibilmente tentare di creare anche quello schema dal momento che è dove si trova la mia tabella), ma quando ho provato i passaggi precedenti con la mia tabella in uno schema diverso, i risultati erano gli stessi e i messaggi di errore erano identici.

Sto facendo qualcosa di sbagliato? Perché visualizzo questo errore?

Risposte:


16

L'errore è innocuo, ma per eliminarlo, penso che sia necessario suddividere questo ripristino in due comandi, come in:

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

L' --cleanopzione in pg_restore non sembra molto ma in realtà solleva problemi non banali.

Per versioni fino a 9.1

La combinazione di --createe --cleanin pg_restore opzioni era un errore nelle versioni PG precedenti (fino a 9.1). Esiste davvero una contraddizione tra (citando la manpage 9.1):

--clean Pulisci (elimina) gli oggetti del database prima di ricrearli

e

--create Crea il database prima di ripristinarlo.

Perché qual è il punto di pulizia all'interno di un database nuovo di zecca?

A partire dalla versione 9.2

La combinazione è ora accettata e il documento dice questo (citando la manpage 9.3):

--clean Pulisci (elimina) gli oggetti del database prima di ricrearli. (Ciò potrebbe generare alcuni messaggi di errore innocui, se non fossero presenti oggetti nel database di destinazione.)

--create Crea il database prima di ripristinarlo. Se viene specificato anche --clean, rilasciare e ricreare il database di destinazione prima di connettersi ad esso.

Ora avere entrambi insieme porta a questo tipo di sequenza durante il ripristino:

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

Non c'è nessun DROPper ogni singolo oggetto, solo DROP DATABASEa all'inizio. Se non si utilizza --createquesto sarebbe il contrario.

Comunque questa sequenza genera l'errore dello publicschema già esistente perché la creazione mydbda lo template0ha già importato (che è normale, è il punto di un database modello).

Non sono sicuro del perché questo caso non sia gestito automaticamente da pg_restore. Forse ciò causerebbe effetti collaterali indesiderati quando un amministratore decide di personalizzare template0e / o modificare lo scopo di public, anche se non dovremmo farlo.


Sto usando 9.6, e specificare --createsenza cleanrisolvere il problema.
Cerin,

6

Nel mio caso, il motivo era che stavo usando pg_restorepostgresql-contrib versione 11.2 per ripristinare un dump creato dapg_dump 9.6 in un cluster PostgreSQL 9.6.

Dopo il downgrade della mia pg_restoreschiena a 9.6, questo schema "public" already existserrore era scomparso e il processo di ripristino ha funzionato come prima.


Ma hai ripristinato il dump usando pg_restore 9.6 in un database postgres 11.2?
Mariano Ruiz,

@MarianoRuiz Penso che la mia risposta originale sia chiara: "Stavo usando pg_restore dalla versione 11.2 di postgresql-contrib per ripristinare un dump creato da pg_dump 9.6 in un cluster 9.6 di PostgreSQL." Quindi alla tua domanda: no, non l'ho fatto. Il mio pg_restore era 11.2 mentre il cluster pg era 9.6
Lu Liu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.