restaurar respaldo respaldar postgres por pg_restore exportar datos crear copia consola postgresql pg-dump pg-restore

postgresql - respaldo - Quiero restaurar la base de datos con un esquema diferente



restaurar base de datos postgresql consola windows (7)

He tomado un volcado de una base de datos llamada temp1 , usando el siguiente comando

$ pg_dump -i -h localhost -U postgres -F c -b -v -f pub.backup temp1

Ahora quiero restaurar el volcado en una base de datos diferente llamada "db_temp", pero en eso solo quiero que todas las tablas se creen en un "temp_schema" (no el esquema predeterminado que está en la base de datos fms temp1) que está en la base de datos "db_temp".

¿Hay alguna manera de hacer esto usando el comando pg_restore ?

¡Cualquier otro método también será apreciado!


Cambie el nombre del esquema en una base de datos temporal.

Exportar el esquema:

pg_dump --schema-only --schema=prod > prod.sql

Crea una nueva base de datos. Restaure la exportación:

psql -f prod.sql ALTER SCHEMA prod RENAME TO somethingelse; pg_dump --schema-only --schema=somethingelse > somethingelse.sql

(eliminar la base de datos)

Para los datos, solo puede modificar el conjunto search_path en la parte superior.


Como se señaló, no hay soporte directo en pg_dump, psql o pg_restore para cambiar el nombre del esquema durante un proceso de volcado / restauración. Pero es bastante sencillo exportar usando formato "simple" y luego modificar el archivo .sql. Este script de Bash hace lo básico:

rename_schema () { # Change search path so by default everything will go into the specified schema perl -pi -e "s/SET search_path = $2, pg_catalog/SET search_path = $3, pg_catalog, $2;/" "$1" # Change ''ALTER FUNCTION foo.'' to ''ALTER FUNCTION bar.'' perl -pi -e ''s/^([A-Z]+ [A-Z]+) ''$2''/./$1 ''$3''./'' "$1" # Change the final GRANT ALL ON SCHEMA foo TO PUBLIC perl -pi -e ''s/SCHEMA ''$2''/SCHEMA ''$3''/'' "$1" }

Uso:

pg_dump --format plain --schema=foo --file dump.sql MYDB rename_schema dump.sql foo bar psql -d MYDB -c ''CREATE SCHEMA bar;'' psql -d MYDB -f dumpsql


Existe una solución simple:

  • Cree su volcado de respaldo en formato SQL simple (formato "p" usando el parámetro --format=p o -F p )
  • Edite su publicación pub.backup.sql con su editor favorito y agregue las dos líneas siguientes en la parte superior de su archivo:

create schema myschema;

SET search_path TO myschema;

Ahora puede restaurar su volcado de respaldo con el comando

psql -f pub.backup.sql

El set search_path to <schema> establecerá myschema como valor predeterminado, de modo que se creen nuevas tablas y otros objetos en este esquema, independientemente del esquema "predeterminado" donde vivieron antes.


No hay forma en pg_restore. Lo que puede hacer es usar pg_restore para generar un resultado SQL, y luego enviarlo a través de un script sed para cambiarlo. Sin embargo, debe tener cuidado con la forma de escribir ese script sed, por lo que no coincide y cambia las cosas dentro de sus datos.


Probablemente, el método más fácil sería simplemente cambiar el nombre del esquema después de la restauración, es decir, con el siguiente SQL:

ALTER SCHEMA my_schema RENAME TO temp_schema

Creo que, debido a que está utilizando el formato de archivo comprimido para la salida de pg_dump, no puede modificarlo antes de restaurarlo. La opción sería usar la salida predeterminada y hacer una búsqueda y reemplazar en el nombre del esquema, pero eso sería arriesgado y tal vez podría dañar los datos si no tuviera cuidado.


Si solo tiene algunas tablas, puede restaurar una tabla a la vez, pg_restore acepta -d database cuando especifica -t tablename . Por supuesto, tendrá que configurar el esquema antes de restaurar las tablas y luego ordenar los índices y las restricciones cuando termine de restaurar las tablas.

De forma alternativa, configure otro servidor en un puerto diferente, restaure con el nuevo servidor PostgreSQL, cambie el nombre del esquema, voltéelo y restaure en su base de datos original. Esto es un poco complicado, por supuesto, pero hará el trabajo.

Si eres aventurero, podrías cambiar el nombre de la base de datos en el archivo de volcado usando un editor hexadecimal. Creo que solo se menciona en un lugar del vertedero y, siempre que los nombres de las bases de datos nuevos y antiguos sean los mismos, debería funcionar. YMMV, no hagas nada como esto en un entorno de producción, no me culpes si esto explota y nivela tu ciudad natal, y todo el resto de las renuncias habituales.


Una manera rápida y sucia:

1) cambiar el nombre del esquema predeterminado:

alter schema public rename to public_save;

2) crear un nuevo esquema como esquema predeterminado:

create schema public;

3) restaurar datos

pg_restore -f pub.backup db_temp [and whatever other options]

4) renombrar esquemas de acuerdo a la necesidad:

alter schema public rename to temp_schema; alter schema public_save rename to public;