Vous n'êtes pas identifié(e).

#1 10/07/2018 11:03:59

jeanphi45
Membre

[PostgreSQL 9.6.9] dump d'une table

Bonjour ,

Voici ce que je dois faire et qui ne fonctionne plus : dump d'une table puis restauration dans une autre BD en changeant le schema

Avant je fais le dump : pg_dump --host monserveur --port monport  --username postgres --format plain --no-owner --no-privileges --verbose --table schema1.matable
puis pipe sed  's/search_path = schema1/search_path = schema2/'

Mais le dump a changé au nouveau du search path (SELECT pg_catalog.set_config('search_path', '', false)
et le cherche remplace ne fonctionne plus

D'où une première question : y a-t-il moyen de revenir à un dump avec search path et où la table est indiquée sans son schéma ?

Et sinon il y a peut-être plus simple dorénavant par rapport au besoin initial

Hors ligne

#2 10/07/2018 11:22:27

gleu
Administrateur

Re : [PostgreSQL 9.6.9] dump d'une table

Non, il n'est pas possible de revenir au comportement initial de pg_dump. La modification réalisée en 9.6.8 a pour but de combler une faille de sécurité. Du coup, il n'y a pas d'options pour la rétablir smile

Il faut donc changer votre sed pour transformer le "CREATE TABLE schema1.matable" en "CREATE TABLE schema2.matable".


Guillaume.

Hors ligne

#3 10/07/2018 11:33:00

jeanphi45
Membre

Re : [PostgreSQL 9.6.9] dump d'une table

En fait le schema apparaît à d'autres endroits dans le dump. Pas simple

Hors ligne

#4 10/07/2018 11:34:54

jeanphi45
Membre

Re : [PostgreSQL 9.6.9] dump d'une table

Je remplacerais bien schema1.matable par schema2.matable mais je ne sais pas si cela suffit.

Dernière modification par jeanphi45 (10/07/2018 11:35:08)

Hors ligne

#5 10/07/2018 11:57:39

ruizsebastien
Membre

Re : [PostgreSQL 9.6.9] dump d'une table

bonjour,

Chez nous on fait du sed pour remplacer le nom du schéma, mais d'expérience c'est très couteux sur de gros dump en temps et en espace disque (sed produit un 2ème fichier de la même taille que le dump le temps de la transformation).
Du coup si quelqu'un à une meilleur idée, je suis preneur.


Cordialement,

Sébastien.

Hors ligne

#6 10/07/2018 11:58:16

jeanphi45
Membre

Re : [PostgreSQL 9.6.9] dump d'une table

ça a l'air de fonctionner :


sed  's/schema1.matable/schema2.matable/g'

(ne pas oublier le /g si l'occurence apparait plusieurs fois sur une même ligne)

Dernière modification par jeanphi45 (10/07/2018 11:59:20)

Hors ligne

#7 10/07/2018 13:14:09

gleu
Administrateur

Re : [PostgreSQL 9.6.9] dump d'une table

C'est coûteux et dangereux mais il n'y a pas d'autres solutions à ma connaissance.


Guillaume.

Hors ligne

#8 10/07/2018 13:15:04

dverite
Membre

Re : [PostgreSQL 9.6.9] dump d'une table

il faudrait exporter et importer séparément la structure et les données, pour éviter de passer la recherche/remplacement sur les données, qui est coûteuse mais aussi dangereuse (si le contenu recherché s'avère être présent dans les données par coïncidence).


Voir les options de pg_dump --schema-only et --data-only

Hors ligne

#9 10/07/2018 13:21:34

gleu
Administrateur

Re : [PostgreSQL 9.6.9] dump d'une table

Le seul moyen réellement sûr de le faire serait de modifier pg_restore pour qu'il prenne en compte cette fonctionnalité. Même pas dit qu'une fonctionnalité de ce genre serait acceptée.


Guillaume.

Hors ligne

#10 10/07/2018 14:14:09

jeanphi45
Membre

Re : [PostgreSQL 9.6.9] dump d'une table

gleu a écrit :

C'est coûteux et dangereux mais il n'y a pas d'autres solutions à ma connaissance.

Attention notamment aux noms de table entre guillemets. exemple data."analyse" , ce sed ne fonctionne pas

Hors ligne

#11 10/07/2018 14:17:09

ruizsebastien
Membre

Re : [PostgreSQL 9.6.9] dump d'une table

dverite a écrit :

il faudrait exporter et importer séparément la structure et les données, pour éviter de passer la recherche/remplacement sur les données, qui est coûteuse mais aussi dangereuse (si le contenu recherché s'avère être présent dans les données par coïncidence).


Voir les options de pg_dump --schema-only et --data-only

oui sauf que depuis les mises à jours mineures récentes, le nom du schéma se retrouve dans les ordres copy (ou insert) du dump --data-only.
Donc pas d'autres choix que de parser les données aussi... (effectivement très dangereux pour les données)

gleu a écrit :

Le seul moyen réellement sûr de le faire serait de modifier pg_restore pour qu'il prenne en compte cette fonctionnalité. Même pas dit qu'une fonctionnalité de ce genre serait acceptée.

Dommage... dans les entreprises c'est un besoin quotidien : rafraîchir une base de dev via une base de prod.


Cordialement,

Sébastien.

Hors ligne

#12 10/07/2018 14:27:15

gleu
Administrateur

Re : [PostgreSQL 9.6.9] dump d'une table

Dans ce cas, tu crées une nouvelle base dans ton instance de dév. Je ne vois pas ce que le schéma vient faire là-dedans.


Guillaume.

Hors ligne

#13 10/07/2018 14:47:36

ruizsebastien
Membre

Re : [PostgreSQL 9.6.9] dump d'une table

gleu a écrit :

Dans ce cas, tu crées une nouvelle base dans ton instance de dév. Je ne vois pas ce que le schéma vient faire là-dedans.

dans certaines entreprise, dont la mienne, il y a des normes dans les noms de bases et de schémas. Et donc on ne nomme jamais un schéma de prod de la même manière qu'un schéma de dev.


Cordialement,

Sébastien.

Hors ligne

#14 10/07/2018 15:07:58

gleu
Administrateur

Re : [PostgreSQL 9.6.9] dump d'une table

Toujours possible de le renommer après restauration complète. Il y a certainement un truc qui rend la chose pas facile, mais j'avoue que je ne vois pas quoi smile


Guillaume.

Hors ligne

Pied de page des forums