web-dev-qa-db-fra.com

PostgreSQL: Comment créer une copie complète du schéma de base de données dans la même base de données?

Comment puis-je copier mon schéma public dans la même base de données avec la structure complète de la table, les données, les fonctions, fk, pk, etc.
Ma version de Postgres est 8.4
P.S. J'ai besoin de copier schéma PAS la base de données

27
sigra

Il n'y a pas de moyen simple de le faire dans pg_dump/pg_restore lui-même. Vous pouvez essayer ce qui suit si vous pouvez supprimer temporairement la base de données.

  1. Faites un vidage de votre schéma public en utilisant pg_dump
  2. exécuter "ALTER SCHEMA public RENAME TO public_copy"
  3. Restaurez votre vidage de votre schéma public à partir de l'étape 1 en utilisant pg_restore
24
user1113185
pg_dump -n schema_name > dump.sql
vi dump.sql # edit the schema name
psql: psql -f dump.sql

Si vous êtes bloqué avec php, utilisez l'un ou l'autre des tics

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

ou la commande exec (). Pour le changement, vous pouvez utiliser sed de la même manière.

Voici 6 autres caractères

9
Scott Marlowe

En utilisant pgAdmin, vous pouvez effectuer les opérations suivantes. C'est assez manuel, mais c'est peut-être tout ce dont vous avez besoin. Une approche basée sur des scripts serait beaucoup plus souhaitable. Je ne sais pas dans quelle mesure cela fonctionnera si vous ne disposez pas d'un accès administrateur et si votre base de données est volumineuse, mais devrait fonctionner correctement sur une base de données de développement que vous avez juste sur votre ordinateur local.

  1. Cliquez avec le bouton droit sur le nom du schéma que vous souhaitez copier et cliquez sur Sauvegarder. (Vous pouvez aller plus loin que cela et choisir de simplement sauvegarder la structure au lieu des deux).

  2. Donnez un nom au fichier de sauvegarde et choisissez également un format. (J'utilise habituellement Tar.)

  3. Cliquez sur Sauvegarde.

  4. Cliquez avec le bouton droit sur le schéma à partir duquel vous avez sauvegardé, cliquez sur Propriétés et renommez-le temporairement en quelque chose d'autre. (par exemple temprename)

  5. Cliquez sur la racine des schémas et cliquez dessus avec le bouton droit dans l'explorateur d'objets et cliquez sur créer un nouveau schéma et donnez au schéma le nom public. Ce sera le schéma dans lequel vous copiez depuis votre sauvegarde.

  6. Cliquez avec le bouton droit sur le nouveau schéma public à partir de l'étape 5. et cliquez sur restaurer. Restaurez à partir du fichier de sauvegarde à l'étape 3.

  7. Renommez le nouveau schéma public sous un nom différent (par exemple newschema).

  8. Renommez le schéma temprename changez de l'étape 4 au nom d'origine.

7
Kuberchaun

Vous pourriez utiliser

CREATE DATABASE new_db TEMPLATE = old_db;

Supprimez ensuite tous les schémas dont vous n'avez pas besoin:

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

Le seul inconvénient est que toutes les connexions à old_db doivent être déterminées avant de pouvoir créer la copie (donc le processus qui exécute le CREATE DATABASE l'instruction doit se connecter, par exemple au template1)

Si ce n'est pas une option, pg_dump/pg_restore est le seul moyen de le faire.

5

développant sur user1113185 réponse , voici un flux de travail complet en utilisant psql/pg_dump.

Ce qui suit exporte tous les objets de old_schema et les importe dans de nouveaux new_schema schéma, comme user, dans la base de données dbname:

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
3
dwelle