2010-11-16 47 views
34

Queridos todos,
he tomado un volcado de una base de datos llamada Temp 1
usando el comando follwingQuiero restaurar la base de datos con un esquema diferente

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

Ahora quiero restaurar el volcado de una manera diferente base de datos 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 apreciará!
¡Gracias de antemano!

+6

simplemente no puedo aceptar que esto todavía esté sucediendo en 2017, y la solución es piratear el archivo de volcado. – Sharky

Respuesta

9

No hay forma en que 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.

7

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 que pueda No lo modifique 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.

+0

Esta solución puede hacer mucho lío, ¿no? – abubacker

+3

¿De qué manera? La declaración SQL es la única forma segura de cambiar un nombre de esquema. La otra solución también se sugiere en otra respuesta y ambos explicamos que es arriesgada. Baja votación negativa. – Hamish

+1

Cambié el nombre del esquema pero, después de eso, ¡no puedo cambiar la ruta de acceso! ¡El usuario no puede buscar ninguna tabla después del cambio de nombre! –

3

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.

Como 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 es aventurero, es posible que pueda cambiar el nombre de la base de datos en el archivo de volcado mediante 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.

32

Una rápida y sucia forma:

1) cambiar el nombre de esquema por defecto:

alter schema public rename to public_save; 

2) crear un nuevo esquema como esquema predeterminado:

create schema public; 

3) restaurar los datos

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

4) renam e esquemas según las necesidades:

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

Hay una solución simple:

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

crear el esquema myschema;

SET search_path TO myschema;

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

psql -f pub.backup.sql

El "set search_path a" orden fijará miesquema como predeterminado, para que nuevas tablas y otros objetos sean creados en este esquema, independientemente del esquema "predeterminado" donde vivieron antes.

+0

¿Hay alguna forma de editar realmente solo el encabezado de un archivo de volcado grande? Incluso cosas como esta implican duplicarlo: http: // superuser.com/questions/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-bash –

+0

@PeterEhrlich Según el tamaño de sus archivos y la memoria RAM disponible, puede usar vim para abra un archivo de volcado gzip'd directamente. Todavía se expande en la memoria, pero pude abrir, editar y guardar un archivo de 750MB (.gz) con solo una breve pausa al guardar. YMMV. – David

+0

Encontré que mis volcados ya tenían uno o más SET search_path TO ...; líneas que necesitaba eliminar Es posible que desee buscar "search_path" al editar y antes de restaurar. Al menos tendrá un SET search_path TO ...; línea para cada esquema de los objetos que fueron objeto de dumping. Sería bueno si hubiera una opción --without-schema que funcionara como la opción --no-owner. – David

0

Cambie 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)

Por los datos que sólo puede modificar el conjunto search_path en la parte superior.

Cuestiones relacionadas