perché pg_restore ignora --create? Errore: non riuscito: FATAL: il database "new_db" non esiste


16

Sto cercando di eseguire il seguente comando:

sshpass  -p "pass" ssh  x@1.2.3.4 "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db

Ottengo:

failed: FATAL:  database "new_db" does not exist

Risposte:


19

Questo perché funziona così pg_restore.

Il manuale di pg_restore è il seguente :

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

Quando viene utilizzata questa opzione, il database denominato con -d viene utilizzato solo per emettere i comandi DROP DATABASE e CREATE DATABASE iniziali . Tutti i dati vengono ripristinati nel nome del database che appare nell'archivio .

-D verrà ripristinato nel database specificato se e solo se -C non viene utilizzato. Se si utilizza -C, il database viene utilizzato come "launchpad", non come destinazione.


6
Per chiarire: non è possibile creare un nome di database arbitrario e ripristinarlo con esso pg_restore. L'opzione -C può solo creare un database il cui nome corrisponde al nome del database nel file di dump. Per ripristinare su un database arbitrario, è necessario eseguire CREATE DATABASE new_db;in psql prima di eseguire pg_restore --dbname=new_db.
Luca,

il mio comandodocker-compose -p dump_import -f docker/dump_import.yml run --rm be bash -c 'waitforit -host=postgres -port=5432 -timeout=30 && export PGPASSWORD=$DATABASE_PASSWORD && createdb --echo --port=$DATABASE_PORT -host=$DATABASE_HOST --username=$DATABASE_USER $DATABASE_NAME && pg_restore --format=c --dbname=$DATABASE_URL_WITHOUT_QUERY tmp/full.dump && echo "Import done"'
srghma,

5
Perché gli strumenti devono essere fonte di confusione quando potrebbero essere facili?
Augustin Riedinger,

8

In breve, vuoi uno (pulito esistente): (nota che il nome del database è postgres)

pg_restore -c -d postgres db.dump

o (crea nuovo)

pg_restore -C -d postgres db.dump

oppure (crearne di esplicitamente nuove)

createdatabase the_database
pg_restore -d the_database db.dump

Guarda cosa ha detto SCO per maggiori dettagli.


Il tuo primo suggerimento non ha funzionato il 9.1:pg_restore: [archiver] -C and -c are incompatible options
peetasan,

Posso confermare che funziona (dopo la modifica e dopo aver corretto l'ortografia di "postgres"). pg_restore -C -d postgres db.dumppuò sembrare spaventoso, ma non fa nulla al database postgres, lo usa solo per la connessione iniziale.
Zilk,

0

Per essere un po 'più esplicito, questo è quello che ho fatto che ha risolto il problema per me:

  1. Crea un database vuoto con il nome che desideri: (nel mio caso il nome utente era 'postgres')

    psql -U [username]

Ti chiederà quindi la password. A questo punto sarai loggato come [nome utente]. Digita quanto segue:

    CREATE DATABASE [dbname];

Ora esci dalla sessione e torna alla tua normale sessione terminale.

  1. Ripristinare il database dal file in cui è stato impostato il nome del database di destinazione come nome del database appena creato.

    cat [your_file_path/filename] | psql -U [username] [dbname]

Dove [percorso_file / nomefile] è la posizione del file db o del file di testo che si desidera ripristinare.


Quando si crea il backup utilizzando l' -Fopzione de , è necessario utilizzare pg_restore per ripristinare il backup, a meno che non si utilizzi -F pche produce un file di testo semplice con frasi sql.
EAmez,
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.