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

26

Comment je peux copier mon publicschéma dans la même base de données avec la structure complète de la table, les données, les fonctions, fk, pk et etc.
Ma version de Postgres est 8.4
PS J'ai besoin de copier le schéma PAS la base de données

Sigra
la source
Avez-vous plus de schémas, ou seulement public?
a_horse_with_no_name
J'ai des schémas publics et de démonstration. Et je dois copier la démo pour créer un compte démo ...
Ce serait une chose pratique à faire.
Kuberchaun

Réponses:

19

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 à l'aide de pg_restore
user1113185
la source
comment puis-je accéder à pg_dump et pg_restore via PHP?
Cela dépend de l'endroit où vous exécutez la base de données. Vous pouvez accéder à pg_dump et pg_restore à partir du shell sur votre serveur. Si vous n'avez pas accès au shell, vous pouvez essayer d'utiliser PHP shell_exec , sinon vous devrez chercher une autre méthode de sauvegarde, peut-être en utilisant un outil GUI PostgreSQL
1
+1 C'est la solution la plus intelligente à ce jour. Commande Shell ressemblerait à quelque chose comme ça ( plus dans le manuel ): pg_dump -n my_schema -f '/path/to/file.pgsql' my_db. Plus simple en tant que superutilisateur ( postgres) avec une peerautorisation sans alimentation dans pg_haba.conf. Restaurer après avoir renommé le schéma original: psql my_db -f '/path/to/file.pgsql'. Si vous avez un vidage SQL simple, vous n'en avez pas besoin pg_restore.
Erwin Brandstetter
Il existe un moyen simple, voir ma réponse. pg_dump prend en charge le commutateur -n pour choisir un schéma. Ensuite, modifiez simplement le nom du schéma dans le vidage et rechargez.
Scott Marlowe
2
Le simple fait de renommer le schéma ne mettra pas à jour les références dans les fonctions: gist.github.com/pschultz/5387172 . Remplacer le nom est le vidage est beaucoup plus fiable si vous obtenez votre recherche et remplacez correctement.
Peter
9
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

Scott Marlowe
la source
1
il est plus sûr de renommer le schéma et de recharger le schéma d'origine sauvegardé, en particulier lorsque le nom du schéma peut apparaître comme contenu (par exemple public).
artm
7

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 très bien 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 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 de la souris dans le navigateur d'objets, puis 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. Renommer schéma temprename changement de l' étape 4 de retour au nom d' origine.

Kuberchaun
la source
Le nouveau schéma créé à l'étape 5 doit avoir le même nom que le schéma que vous avez sauvegardé, sinon pgAdmin ne restaurera rien.
Cao Minh Tu
5

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 l' CREATE DATABASEinstruction doit se connecter par exemple à template1)

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

un cheval sans nom
la source
1
Avant de poser cette question, j'ai utilisé une méthode similaire de clonage d'une base de données. Mais cela passe beaucoup de temps et je pense que le clonage du seul schéma est beaucoup plus rapide ...
@sigra: la méthode de clonage de a_horse est la plus rapide disponible pour les bases de données, car les fichiers réels peuvent être simplement copiés, ce qui économise beaucoup de frais généraux. Je doute qu'un vidage et un rechargement du schéma seront plus rapides à moins que le schéma ne soit qu'une petite partie de l'ensemble de la base de données. Donc, +1 pour cette réponse même si elle ne répond pas à la question posée.
Erwin Brandstetter
C'est beaucoup de travail pour cloner un seul schéma. vider le schéma, le renommer dans le vidage et le rechargement est beaucoup plus rapide.
Scott Marlowe
@ScottMarlowe: dépend du schéma le plus important. Si le plus grand est l'un des abandonnés, alors oui, je suis d'accord.
a_horse_with_no_name
2

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

Ce qui suit exporte tous les objets de old_schemaet les importe dans un nouveau new_schemaschéma, comme userdans la dbnamebase de données:

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
dwelle
la source