Esportare e importare un database PostgreSQL con un nome diverso?


39

C'è un modo per esportare un database PostgreSQL e successivamente importarlo con un altro nome?

Sto usando PostgreSQL con Rails e spesso esporto i dati dalla produzione, dove il database si chiama blah_production e li importa in fase di sviluppo o stadiazione con nomi blah_development e blah_staging. Su MySQL questo è banale poiché l'esportazione non ha il database da nessuna parte (tranne forse un commento), ma su PostgreSQL sembra impossibile. È impossibile?

Attualmente sto scaricando il database in questo modo:

pg_dump blah > blah.dump

Non sto usando le opzioni -c o -C. Tale deposito contiene dichiarazioni come:

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

Quando provo a importare con

psql blah_devel < blah.dump

ottengo

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

Forse il problema non è proprio il database ma il ruolo?

Se lo scarico in questo modo:

pg_dump --format=c blah > blah.dump

e prova a importarlo in questo modo:

pg_restore -d blah_devel < tmp/blah.psql

Ottengo questi errori:

pg_restore: WARNING:  database "blah" does not exist
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 1513; 1259 16435 TABLE checks blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.checks OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1509; 1259 16409 TABLE users blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1508; 1259 16407 SEQUENCE users_id_seq blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users_id_seq OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1824; 0 0 ACL public postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: REVOKE ALL ON SCHEMA public FROM postgres;
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: GRANT ALL ON SCHEMA public TO postgres;
WARNING: errors ignored on restore: 11

Qualche idea?

Ho visto là fuori alcune persone che usano script sed per modificare il dump. Vorrei evitare quella soluzione, ma se non ci sono alternative la prenderò. Qualcuno ha scritto uno script per alterare il nome del database del dump per garantire che nessun dato venga mai modificato?

Risposte:


42

La soluzione lo scaricava in questo modo:

pg_dump --no-owner --no-acl blah > blah.psql

e importandolo in questo modo:

psql blah_devel < blah.psql > /dev/null

Ricevo ancora questo avviso:

WARNING:  database "blah" does not exist

ma il resto sembra funzionare.


2
Sei un
salvavita

life saver bro :)
Sai chi

11

Se si sta creando un dump di testo, è possibile esportare il database senza i CREATE DATABASEbit (ovvero non specificare -ce - Copzioni in pg_dump); Ciò impedirà a Postgres di tentare di eliminare, creare e connettersi al database.

Se si utilizza uno dei formati di archivio, è possibile specificare l' -dopzione pg_restoreper nominare il database in cui si desidera ripristinare.

Controlla le pagine man per pg_dumpe pg_restoreper maggiori dettagli, e non dimenticare di montare una scimmia scratch prima di provare questo sui sistemi di produzione nel caso in cui avessi lasciato fuori alcuni dettagli importanti.


Grazie. Proverò -da con pg_restore, ma per ora lo sto scaricando come testo e in pg_dump non sto specificando né -c né -C. Sto solo chiamando pg_dump nome database. Mi sto perdendo qualcosa?
pupeno,

senza opzioni pg_dumpdovresti creare un dump che ripristini in qualsiasi database a cui sei connesso (è passato un po 'di tempo da quando ho fatto un dump del testo e ripristinato su un altro DB, ma se non ci sono CREATEe \connectbit viene eseguito l'SQL nel dump del testo ovunque tu sia quando \iporti il ​​file di dump.
voretaq7,

pg_dump in modalità testo o binaria, per impostazione predefinita, ha tonnellate di menzioni del nome del database.
pupeno,

6

Ora pg_restore ha l'opzione -d e puoi impostare il nome del database per l'importazione dei dati.

alla fonte :

pg_dump -v -Fc mydb.dmp mydb

su dest :

Createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp


3
Questa sintassi ha funzionato per me: pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5).
Paolo,
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.