PostgreSQL: ¿Cómo crear una copia completa del esquema de la base de datos en la misma base de datos?

26

Cómo puedo copiar mi publicesquema en la misma base de datos con estructura de tabla completa, datos, funciones, fk, pk y etc.
Mi versión de Postgres es 8.4
PS. Necesito copiar el esquema NO la base de datos

sigra
fuente
¿Tienes más esquemas, o solo public?
a_horse_with_no_name
Tengo esquemas públicos y de demostración. Y necesito copiar de demostración para la creación de cuenta demo ...
Sería una cosa útil poder hacer.
Kuberchaun

Respuestas:

19

No hay una manera simple de hacer esto en pg_dump / pg_restore en sí. Puede intentar lo siguiente si puede eliminar la base de datos temporalmente.

  1. Haz un volcado de tu esquema público usando pg_dump
  2. ejecute "ALTER SCHEMA public RENAME TO public_copy"
  3. Restaure su volcado de su esquema público desde el paso 1 usando pg_restore
usuario1113185
fuente
¿Cómo puedo acceder a pg_dump y pg_restore a través de PHP?
Eso depende de dónde esté ejecutando la base de datos. Puede acceder a pg_dump y pg_restore desde el shell de su servidor. Si no tiene acceso a shell, puede intentar usar PHP shell_exec , de lo contrario deberá buscar un método de copia de seguridad alternativo, tal vez usando una herramienta GUI de PostgreSQL
1
+1 Esa es la solución más inteligente hasta ahora. Comando de Shell sería algo como esto ( más en el manual ): pg_dump -n my_schema -f '/path/to/file.pgsql' my_db. Más fácil como superusuario ( postgres) con peerautorización sin pw en pg_haba.conf. Restauración después de haber cambiado el nombre del esquema original: psql my_db -f '/path/to/file.pgsql'. Si tiene un volcado de SQL simple, no lo necesita pg_restore.
Erwin Brandstetter
Hay una manera fácil, mira mi respuesta. pg_dump admite el modificador -n para elegir un esquema. Luego solo edite el nombre del esquema en el volcado y vuelva a cargar.
Scott Marlowe
2
Simplemente renombrar el esquema no actualizará las referencias dentro de las funciones: gist.github.com/pschultz/5387172 . Reemplazar el nombre es el volcado es mucho más confiable si realiza su búsqueda y reemplaza correctamente.
Peter
9
pg_dump -n schema_name > dump.sql
vi dump.sql # edit the schema name
psql: psql -f dump.sql

Si está atrapado con php, use cualquiera de los tics posteriores

`/usr/bin/pg_dump-n myschema mydb -U username > /tmp/dump.sql`

o el comando exec (). Para el cambio, puede usar sed de la misma manera.

Aquí hay 6 caracteres más

Scott Marlowe
fuente
1
es más seguro cambiar el nombre del esquema y volver a cargar el esquema original respaldado, especialmente cuando el nombre del esquema puede aparecer como contenido (por ejemplo public).
artm
7

Usando pgAdmin puedes hacer lo siguiente. Es bastante manual, pero podría ser todo lo que necesitas. Un enfoque basado en guiones sería mucho más deseable. No estoy seguro de qué tan bien funcionará esto si no tiene acceso de administrador y si su base de datos es grande, pero debería funcionar bien en una base de datos de desarrollo que solo tiene en su computadora local.

  1. Haga clic con el botón derecho en el nombre del esquema que desea copiar y haga clic en Copia de seguridad. (Puede profundizar más que esto y elegir simplemente hacer una copia de seguridad de la estructura en lugar de ambas).

  2. Dé un nombre al archivo de copia de seguridad y también elija un formato. (Usualmente uso alquitrán)

  3. Haz clic en Copia de seguridad.

  4. Haga clic con el botón derecho en el esquema del que realizó la copia de seguridad y haga clic en propiedades y cámbiele el nombre a algo más temporalmente. (por ejemplo, temprename )

  5. Haga clic en la raíz de los esquemas y haga clic con el botón derecho en el navegador de objetos y haga clic en crear nuevo esquema y déle un nombre público . Este será el esquema en el que está copiando desde su copia de seguridad.

  6. Haga clic con el botón derecho en el nuevo esquema público del paso 5. y haga clic en restaurar. Restaurar desde el archivo de copia de seguridad en el paso 3.

  7. Cambie el nombre del nuevo esquema público a un nombre diferente (por ejemplo, newschema ).

  8. Cambiar nombre de esquema temprename cambio del paso 4 de nuevo al nombre original.

Kuberchaun
fuente
El nuevo esquema creado en el paso 5 debe tener el mismo nombre que el esquema del que realizó la copia de seguridad; de lo contrario, pgAdmin no restaurará nada.
Cao Minh Tu
5

Podrías usar

CREATE DATABASE new_db TEMPLATE = old_db;

Luego suelte todos los esquemas que no necesita:

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

El único inconveniente es que todas las conexiones a old_db deben determinarse antes de que pueda crear la copia (por lo que el proceso que ejecuta la CREATE DATABASEinstrucción debe conectarse, por ejemplo, a template1)

Si esa no es una opción, pg_dump / pg_restore es la única forma de hacerlo.

un caballo sin nombre
fuente
1
Antes de hacer esta pregunta, utilicé un método similar para clonar una base de datos. Pero pasa mucho tiempo y creo que la clonación de sólo el esquema es mucho más rápido ...
@sigra: el método de clonación de a_horse es el más rápido disponible para las bases de datos, ya que los archivos reales solo se pueden copiar, lo que ahorra muchos gastos generales. Dudo que un volcado y recarga del esquema sea más rápido a menos que el esquema sea solo una pequeña parte de la base de datos completa. Entonces, +1 para esta respuesta, incluso si no responde la pregunta real formulada.
Erwin Brandstetter
Eso es mucho trabajo para clonar un solo esquema. volcar el esquema, renombrarlo en el volcado y volver a cargar es mucho más rápido.
Scott Marlowe
@ScottMarlowe: depende de cuál sea el esquema más grande. Si el más grande es uno de los descartados, entonces sí, estoy de acuerdo.
a_horse_with_no_name
2

expandiendo la respuesta del usuario1113185 , aquí hay un flujo de trabajo completo usando psql / pg_dump.

Lo siguiente exporta todos los objetos old_schemay los importa a un nuevo new_schemaesquema, como user, en la dbnamebase de datos:

psql -U user -d dbname -c 'ALTER SCHEMA old_schema RENAME TO new_schema'
pg_dump -U user -n new_schema -f new_schema.sql dbname
psql -U user -d dbname -c 'ALTER SCHEMA new_schema RENAME TO old_schema'
psql -U user -d dbname -c 'CREATE SCHEMA new_schema'
psql -U user -q -d dbname -f new_schema.sql
rm new_schema.sql
habitar
fuente