42 votos

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

¿Hay alguna manera de exportar una base de datos PostgreSQL y posteriormente 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 staging con 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 sitio (excepto un comentario quizás), pero en PostgreSQL parece que es imposible. ¿Es imposible?

Actualmente estoy volcando la base de datos de esta manera:

pg_dump blah > blah.dump

No utilizo 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 intento importar con

psql blah_devel < blah.dump

Me sale

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

¿Quizás el problema no sea realmente la base de datos sino el papel?

Si lo vierto de esta manera:

pg_dump --format=c blah > blah.dump

y tratar de importarlo de esta manera:

pg_restore -d blah_devel < tmp/blah.psql

Me salen 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

¿Alguna idea?

He visto por ahí que hay gente que utiliza sed scripts para modificar el volcado. Me gustaría evitar esa solución pero si no hay alternativa la tomaré. ¿Alguien ha escrito un scriptsscriptscripts para modificar el nombre de la base de datos del volcado y asegurarse de que no se alteran los datos?

45voto

J. Pablo Fernández Puntos 1427

La solución fue verterlo así:

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

e importarlo así:

psql blah_devel < blah.psql > /dev/null

Todavía recibo esta advertencia:

WARNING:  database "blah" does not exist

pero el resto parece funcionar.

11voto

voretaq7 Puntos 63415

Si está creando un volcado de texto, puede exportar la base de datos sin el CREATE DATABASE bits (es decir, no especificar -c y - C opciones para pg_dump ) ; Esto evitará que Postgres intente soltar, crear y conectarse a la base de datos.

Si está utilizando uno de los formatos de archivo, puede especificar el -d opción de pg_restore para nombrar la base de datos que desea restaurar.

Consulte las páginas de manual de pg_dump y pg_restore para más detalles, y no olvides montar un mono de rascarse antes de intentar esto en los sistemas de producción en caso de que haya omitido algún detalle importante.

8voto

FuzzyAmi Puntos 101

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

en la fuente :

pg_dump -v -Fc mydb.dmp mydb

en el destino :

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: