Je veux restaurer la firebase database avec un schéma différent

J’ai pris une sauvegarde d’une firebase database 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 le dump dans une firebase database différente appelée “db_temp”, mais je veux juste que toutes les tables soient créées dans un “temp_schema” (pas le schéma par défaut qui se trouve dans la firebase database fms temp1) la firebase database “db_temp”.

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

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

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 via un script sed pour le modifier. Cependant, vous devez faire attention à la manière dont vous écrivez ce script sed afin qu’il ne corresponde pas et ne modifie pas les données à l’intérieur de vos données.

Il y a une solution simple:

  • Créez votre --format=p sauvegarde au format SQL brut (format “p” en utilisant le paramètre --format=p ou -F p )
  • Modifiez votre sauvegarde 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 définira myschema par défaut, afin que les nouvelles tables et les autres objects soient créés dans ce schéma, indépendamment du schéma par défaut où ils se trouvaient auparavant.

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 en fonction des besoins:

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

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

 ALTER SCHEMA my_schema RENAME TO temp_schema 

Je crois 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 de faire une recherche et de remplacer le nom du schéma, mais cela serait risqué et pourrait peut-être endommager les données si vous ne faites pas attention.

Si vous ne disposez que de quelques tables, vous pouvez restaurer une table à la fois, pg_restore accepte la -d database lorsque vous spécifiez -t tablename . Bien entendu, vous devrez configurer le schéma avant de restaurer les tables, puis sortinger les index et les contraintes lorsque vous aurez fini de restaurer les tables.

Vous pouvez également configurer un autre serveur sur un autre port, restaurer à l’aide du nouveau serveur PostgreSQL, renommer le schéma, le vider et le restaurer dans votre firebase database d’origine. C’est un peu compliqué bien sûr, mais le travail sera fait.

Si vous êtes aventureux, vous pouvez modifier le nom de la firebase database dans le fichier de vidage à l’aide d’un éditeur hexadécimal. Je pense que cela n’est mentionné que dans un seul endroit de la sauvegarde et que tant que les nouveaux et anciens noms de firebase database sont identiques, cela devrait fonctionner. YMMV, ne faites rien de tel dans un environnement de production, ne me blâmez pas si cela explose et nivelle votre ville natale, et tout le rest des avertissements habituels.

Renommez le schéma dans une firebase database temporaire.

Exporter le schéma:

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

Créez une nouvelle firebase database. Restaurer l’exportation:

 psql -f prod.sql ALTER SCHEMA prod RENAME TO somethingelse; pg_dump --schema-only --schema=somethingelse > somethingelse.sql 

(supprimer la firebase database)

Pour les données, vous pouvez simplement modifier le set search_path en haut.

Comme indiqué précédemment, pg_dump, psql ou pg_restore ne permettent pas de modifier le nom du schéma lors d’un processus de sauvegarde / restauration. Mais il est assez simple d’exporter en format “plain” 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/^([AZ]+ [AZ]+) '$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