Quiero restaurar la base de datos con un esquema diferente


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 se aprecia!

Author: Steve Bennett, 2010-11-16

7 answers

No hay manera en pg_restore sí mismo. Lo que puede hacer es usar pg_restore para generar resultados SQL, y luego enviar esto a través de, por ejemplo, un script sed para cambiarlo. Sin embargo, debe tener cuidado con la forma en que escribe ese script sed, para que no coincida y cambie las cosas dentro de sus datos.

 9
Author: Magnus Hagander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-16 13:47:24

Hay una solución simple:

  • Cree su volcado de copia de seguridad en formato SQL simple (formato "p" utilizando el parámetro --format=p o -F p)
  • Edita tu pub.copia.volcado sql con su editor favorito y agregue las siguientes dos líneas en la parte superior de su archivo:

create schema myschema;

SET search_path TO myschema;

Ahora puede restaurar su volcado de copia de seguridad con el comando

psql -f pub.backup.sql

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

 52
Author: fraber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-22 08:01:14

Un camino rápido y sucio:

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) cambiar el nombre de los esquemas según la necesidad:

alter schema public rename to temp_schema;
alter schema public_save rename to public;
 36
Author: shaunc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-01 02:28:10

Probablemente el método más fácil sería simplemente cambiar el nombre del esquema después de restaurar, 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 alterarlo 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 causar que los datos se corrompan si no se tiene cuidado.

 10
Author: Hamish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-16 06:46:06

Si solo tiene unas pocas tablas, entonces 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 restricciones cuando haya terminado de restaurar las tablas.

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

Si es aventurero, puede cambiar el nombre de la base de datos en el archivo de volcado utilizando un editor hexadecimal. Creo que solo se menciona en un lugar en el volcado y mientras los nombres de la base de datos nueva y antigua 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.

 3
Author: mu is too short,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-16 22:49:58

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

Exportar el esquema:

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

Cree una nueva base de datos. Restaurar la exportación:

psql -f prod.sql

ALTER SCHEMA prod RENAME TO somethingelse;

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

(suprímase la base de datos)

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

 2
Author: Sico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-22 12:39:39

Como se ha señalado, 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 de exportar utilizando el formato" llano " a continuación, modificar el .archivo sql. Este script 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
 0
Author: Steve Bennett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-21 03:36:37