Pregunta

he tomado un volcado de un temp1 base de datos llamada, utilizando el comando follwing

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

Ahora quiero restaurar el volcado de una base de datos diferente llamado "db_temp", pero en la que sólo quiero que todas las tablas deben ser creados en un "temp_schema" (no el esquema predeterminado que está en la base de datos FMS Temp 1) que está en la base de datos "db_temp".

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

Cualquier otro método También se apreciará!

¿Fue útil?

Solución

No hay manera en pg_restore sí. Lo que puede hacer es el uso pg_restore para generar la salida de SQL, y luego enviar esto a través de, por ejemplo, una secuencia de comandos sed para cambiarlo. Es necesario tener cuidado con la forma de escribir el guión de sed, sin embargo, por lo que no coincide y cambiar las cosas dentro de sus datos.

Otros consejos

Hay una solución simple:

  • Crea el volcado de copia de seguridad en formato SQL sin formato (formato de "p" con el parámetro o --format=p -F p)
  • Modificar el volcado de pub.backup.sql con su editor favorito y añadir las dos líneas siguientes en la parte superior de su archivo:

create schema myschema;

SET search_path TO myschema;

Ahora puede restaurar el vertedero de copia de seguridad con el comando

psql -f pub.backup.sql

El comando set search_path to <schema> fijará miesquema como predeterminado, de manera que se crean nuevas tablas y otros objetos en este esquema, independientemente del esquema de "default" en la que vivían antes.

Una manera rápida y sucia:

1) cambiar el nombre de esquema por defecto:

alter schema public rename to public_save;

2) Crear nuevo esquema como esquema predeterminado:

create schema public;

3) restaurar los datos

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

4) esquemas de cambio de nombre según la necesidad:

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

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 porque usted está utilizando el formato de archivo comprimido para la salida de pg_dump no se puede modificar antes de restaurar. La opción sería utilizar la salida por defecto y hacer una búsqueda y reemplazar el nombre de esquema, pero eso sería arriesgado y tal vez podría ocasionar que los datos se corrompe si no tenía cuidado.

Si sólo tiene unas pocas mesas continuación, puede restaurar una mesa al mismo tiempo, pg_restore acepta -d database cuando se especifica -t tablename. Por supuesto, tendrá que configurar el esquema antes de la restauración de las tablas y luego ordenar los índices y restricciones cuando haya terminado la restauración de las tablas.

Por otra parte, estableció otro servidor en un puerto diferente, restauración mediante el nuevo servidor PostgreSQL, cambiar el nombre del esquema, lo descarga, y restaurar en su base de datos original. Esto es un poco de una chapuza, por supuesto, pero va a hacer el trabajo.

Si eres un aventurero que podría ser capaz de cambiar el nombre de la base de datos en el archivo de volcado utilizando un editor hexadecimal. Creo que sólo se menciona en un solo lugar en el vertedero y siempre que los nuevos y antiguos nombres de bases de datos son los mismos que debería funcionar. Tu caso es distinto, no hacen nada como esto en un entorno de producción, no me culpes si esta explota y los niveles de su ciudad natal, y todo el resto de las renuncias habituales.

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

Exportar el esquema:

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

Crear 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

(eliminar la base de datos)

Para los datos sólo puede modificar el search_path establecida al principio.

Como se ha señalado, no hay apoyo directo en pg_dump, psql o pg_restore para cambiar el nombre de esquema durante un volcado de proceso / restauración. Pero es bastante sencillo para exportar utilizando el formato "normal" y luego 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top