Question

J'ai pris une décharge d'une base de données nommée temp1, en utilisant la commande follwing

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

Maintenant, je veux restaurer la décharge dans une autre base de données appelée « DB_Temp », mais que je veux juste que toutes les tables doivent être créés dans un « temp_schema » (pas le schéma par défaut qui est dans la base de données fms TEMP1) qui est dans la base de données « DB_Temp ».

Est-il possible de le faire en utilisant la commande pg_restore?

Toute autre méthode appréciée aussi!

Était-ce utile?

La solution

Il n'y a aucun moyen pg_restore lui-même. Ce que vous pouvez faire est d'utiliser pg_restore pour générer une sortie SQL, puis envoyer ce par exemple un script sed pour le changer. Vous devez être prudent sur la façon dont vous écrivez ce script sed, donc il ne correspond pas et changer les choses à l'intérieur de vos données.

Autres conseils

Il y a une solution simple:

  • Créez votre dump de sauvegarde en format simple SQL (format "p" en utilisant le paramètre --format=p ou -F p)
  • Modifier votre Dump de pub.backup.sql avec votre éditeur préféré 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 de sauvegarde avec la commande

  

psql -f pub.backup.sql

La commande set search_path to <schema> définira mon_schema comme valeur par défaut, de sorte que les nouvelles tables et d'autres objets sont créés dans ce schéma, indépendamment du schéma « par défaut » où ils vivaient auparavant.

Une façon rapide et sale:

1) renommage schéma par défaut:

alter schema public rename to public_save;

2) Créer un nouveau schéma comme 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) les schémas de changement de nom en fonction des besoins:

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

Probablement la méthode la plus simple serait de simplement renommer le schéma après la restauration, par exemple avec l'instruction SQL suivante:

ALTER SCHEMA my_schema RENAME TO temp_schema

Je crois que parce que vous utilisez le format de l'archive compressée pour la sortie de pg_dump vous ne pouvez pas le modifier avant de restaurer. L'option serait d'utiliser la sortie par défaut et effectuez une recherche et remplacer le nom de schéma, mais ce serait risqué et pourrait peut-être des données doivent être corrompues si vous ne faites pas attention.

Si vous avez alors seulement 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 mettre en place le schéma avant de restaurer les tables, puis trier les index et les contraintes lorsque vous avez terminé la restauration des tableaux.

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

Si vous êtes aventureux, vous pourriez être en mesure de changer le nom de la base de données dans le fichier de vidage à l'aide d'un éditeur hexadécimal. Je pense qu'il est mentionné que dans un seul endroit dans la décharge et aussi longtemps que les noms de base de données anciens et nouveaux sont les mêmes qu'il devrait fonctionner. YMMV, ne font rien comme ça dans un environnement de production, ne me blâmez pas si ces coups et les niveaux de votre ville natale, et tout le reste des dénis habituels.

Renommer 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. Restaurer 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 que vous pouvez modifier tout le search_path de jeu en haut.

Comme indiqué, il n'y a pas de soutien direct dans pg_dump, psql ou pg_restore changer le nom du schéma lors d'une sauvegarde / restauration processus. Mais il est assez simple d'exporter en utilisant le format « simple » modifier le fichier sql. Ce script bash 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"

}

Utilisation:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top