¿Exportar e importar una base de datos PostgreSQL con un nombre diferente?

39

¿Hay alguna manera de exportar una base de datos PostgreSQL y luego importarla con otro nombre?

Estoy usando PostgreSQL con Rails y, a menudo, exporto los datos de producción, donde la base de datos se llama blah_production y la importo en desarrollo o puesta en escena con los nombres blah_development y blah_staging. En MySQL esto es trivial ya que la exportación no tiene la base de datos en ningún lado (excepto un comentario tal vez), pero en PostgreSQL parece ser imposible. ¿Es imposible?

Actualmente estoy volcando la base de datos de esta manera:

pg_dump blah > blah.dump

No estoy usando las opciones -c o -C. Ese volcado contiene declaraciones como:

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

Cuando trato de importar con

psql blah_devel < blah.dump

yo obtengo

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

¿Quizás el problema no es realmente la base de datos sino el rol?

Si lo vuelco de esta manera:

pg_dump --format=c blah > blah.dump

e intente importarlo de esta manera:

pg_restore -d blah_devel < tmp/blah.psql

Recibo estos errores:

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

¿Algunas ideas?

He visto por ahí a algunas personas que usan scripts sed para modificar el volcado. Me gustaría evitar esa solución, pero si no hay otra alternativa, la tomaré. ¿Alguien ha escrito un script para alterar el nombre de la base de datos del volcado para garantizar que nunca se alteren los datos?

pupeno
fuente

Respuestas:

42

La solución fue tirarlo así:

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

e importándolo así:

psql blah_devel < blah.psql > /dev/null

Todavía recibo esta advertencia:

WARNING:  database "blah" does not exist

pero el resto parece funcionar.

pupeno
fuente
2
Eres un salvavidas :)
Sri Harsha Kappala
life saver bro :)
Sabes quién es el
11

Si está creando un volcado de texto, puede exportar la base de datos sin los CREATE DATABASEbits (es decir, no especifique -cy - Copciones para pg_dump); Esto evitará que Postgres intente colocar, crear y conectarse a la base de datos.

Si está utilizando uno de los formatos de archivo, puede especificar la -dopción pg_restorepara nombrar la base de datos a la que desea restaurar.

Compruebe las páginas del manual para pg_dumpy pg_restorepara más detalles, y no se olvide de montar un mono cero antes de intentar esto en los sistemas de producción en caso de que me he dejado algún detalle importante.

voretaq7
fuente
Gracias. Daré -da try con pg_restore, pero por el momento, lo descarto como texto y en pg_dump no estoy especificando ni -c ni -C. Solo llamo pg_dump databasename. ¿Me estoy perdiendo de algo?
pupeno
sin opciones pg_dumpdeben crear un vertedero que restaure en cualquier base de datos que estés conectado con (que ha pasado un tiempo desde que hice un vertedero de texto y restaurado a un nivel diferente DB, pero si no hay CREATEy \connectlos bits de SQL en el volcado de texto es ejecutado dondequiera que se encuentre cuando \import el archivo de volcado.
voretaq7
pg_dump en modo texto o binario, por defecto, tiene toneladas de menciones del nombre de la base de datos.
pupeno
6

Ahora pg_restore tiene la opción -d y puede establecer el nombre de la base de datos para importar datos.

en fuente :

pg_dump -v -Fc mydb.dmp mydb

en dest :

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp

Dmitry Kremer
fuente
3
Esta sintaxis funcionó para mí: pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5).
Paolo