web-dev-qa-db-fra.com

Je veux restaurer la base de données avec un schéma différent

J'ai effectué un dump d'une base de données nommée temp1, en utilisant la commande suivante 

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

Maintenant, je veux restaurer le dump dans une autre base de données appelée "db_temp", mais je veux simplement que toutes les tables soient créées dans un "temp_schema" (pas le schéma par défaut qui se trouve dans la base de données fms temp1) la base de données "db_temp". 

Y a-t-il un moyen de faire cela en utilisant la commande pg_restore?

Toute autre méthode sera également appréciée!

49
abubacker

Il n'y a aucun moyen dans pg_restore lui-même. Ce que vous pouvez faire, c'est utiliser pg_restore pour générer une sortie SQL, puis l'envoyer par exemple par un script sed pour le changer. Cependant, vous devez faire attention à la façon dont vous écrivez ce script sed afin qu'il ne corresponde pas et ne modifie pas le contenu de vos données.

9
Magnus Hagander

Il y a une solution simple: 

  • Créez votre copie de sauvegarde au format SQL simple (format "p" en utilisant le paramètre --format=p ou -F p)
  • Editez votre vidage pub.backup.sql avec votre éditeur favori et ajoutez les deux lignes suivantes en haut de votre fichier:

create schema myschema;

SET search_path TO myschema;

Maintenant, vous pouvez restaurer votre sauvegarde avec la commande

psql -f pub.backup.sql

La commande set search_path to <schema> va définir myschema comme valeur par défaut, de sorte que de nouvelles tables et d'autres objets soient créés dans ce schéma, indépendamment du schéma "par défaut" où ils vivaient auparavant.

54
fraber

Un moyen rapide et sale:

1) renommer le schéma par défaut:

alter schema public rename to public_save;

2) créer un nouveau schéma en tant que schéma par défaut:

create schema public;

3) restaurer les données

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

4) renommer les schémas selon les besoins:

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

La méthode la plus simple serait probablement de simplement renommer le schéma après la restauration, c'est-à-dire avec le code SQL suivant:

ALTER SCHEMA my_schema RENAME TO temp_schema

Je pense que parce que vous utilisez le format d'archive compressé pour la sortie de pg_dump, vous ne pouvez pas le modifier avant la restauration. L'option serait d'utiliser la sortie par défaut et d'effectuer une recherche et un remplacement sur le nom du schéma, mais cela présenterait un risque et pourrait peut-être altérer les données si vous ne faites pas attention.

10
Hamish

Si vous ne disposez que de quelques tables, vous pouvez restaurer une table à la fois, pg_restore accepte -d database lorsque vous spécifiez -t tablename. Bien sûr, vous devrez configurer le schéma avant de restaurer les tables, puis trier les index et les contraintes une fois la restauration des tables terminée.

Vous pouvez également configurer un autre serveur sur un autre port, effectuer une restauration à l'aide du nouveau serveur PostgreSQL, renommer le schéma, le vider et le restaurer dans votre base de données d'origine. C'est un peu un kludge bien sûr, mais ça va faire le travail.

Si vous êtes aventureux, vous pourrez peut-être modifier le nom de la base de données dans le fichier de vidage à l'aide d'un éditeur hexadécimal. Je pense qu’il n’est mentionné qu’à un seul endroit du dump et tant que les nouveaux et anciens noms de bases de données sont identiques, cela devrait fonctionner. YMMV, ne faites rien de ce genre dans un environnement de production, ne me blâmez pas si cela explose et nivelle votre ville natale, ainsi que tout le reste des dénis de responsabilité habituels.

3
mu is too short

Renommez le schéma dans une base de données temporaire.

Exporter le schéma:

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

Créer une nouvelle base de données. Restaurez l'exportation:

psql -f prod.sql

ALTER SCHEMA prod RENAME TO somethingelse;

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

(supprimer la base de données)

Pour les données, vous pouvez simplement modifier l'ensemble search_path en haut.

2
Sico

Comme indiqué, pg_dump, psql ou pg_restore ne permettent pas directement de changer le nom du schéma pendant un processus de sauvegarde/restauration. Mais il est assez simple d'exporter en utilisant le format "brut" puis de modifier le fichier .sql. Ce script Bash fait les bases:

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"

}

Usage:

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
0
Steve Bennett