¿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?
fuente
Si está creando un volcado de texto, puede exportar la base de datos sin los
CREATE DATABASE
bits (es decir, no especifique-c
y -C
opciones parapg_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
-d
opciónpg_restore
para nombrar la base de datos a la que desea restaurar.Compruebe las páginas del manual para
pg_dump
ypg_restore
para 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.fuente
pg_dump
deben 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 hayCREATE
y\connect
los bits de SQL en el volcado de texto es ejecutado dondequiera que se encuentre cuando\i
mport el archivo de volcado.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
fuente
pg_dump -v -Fc mydb > mydb.dmp
(pg_dump v9.4.5).