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

#1 23/09/2011 16:07:41

giova
Membre

mission impossible? dump de tables

Bonjour.

Depuis 3 heures maintenant, je tente de faire quelque chose de très simple. Comme je bute complétement, je vais l'expliquer le plus simplement que possible :
Je veux sauver le contenu des tables d'un schema
ET
restaurer ce contenu, sans toucher à la structure, ni aux indexes

Bref obtenir un dump avec ce look :

Disable triggers

truncate table 1
insert into table1 ...

truncate table 2
insert into table 2

Enable triggers

Mes problemes :
1)Je n'ai jamais réussi à faire ce genre de dump via pg_dump
2) meme si je me résoud à tout sauver dans pg_admin, (clic droit sur le shema, sauver puis restaurer) la restauration plante disant que mes contraintes existent déjà
3) en revenant à l'idée de base (ne sauver/restaurer que les données sans toucher au reste) il faut qu'elles soient soient sauvée dans le bon ordre pour ne pas avoir de problèmes de clés externes.

peut on en ligne de commande, faire le dump que je veux?
si la réponse et non, comment régle t'on ce problème de contraintes déjà existantes svp?

Hors ligne

#2 23/09/2011 16:40:43

Marc Cousin
Membre

Re : mission impossible? dump de tables

Avec pg_dump on peut pourtant fabriquer ce genre de dumps. Il suffit d'utiliser l'option -a (data-only) et l'option -t pour lui donner un nom de table.

Sinon, on peut aussi fabriquer un ordre COPY (commande \copy de psql), qui enverra toutes les données d'une table dans un fichier.

Par exemple:
\copy ma_table to /tmp/ma_table.dmp
\copy ma_table2 to /tmp/ma_table2.dmp

Une fois qu'on a fini, il suffit, à la place des inserts dans le script précédent, de mettre des

\copy ma_table from /tmp/ma_table.dmp
etc…


Marc.

Hors ligne

#3 23/09/2011 17:08:38

giova
Membre

Re : mission impossible? dump de tables

pour pg_dump je viens d'essayer (je vous passe les arguments de login)

 -i -F p -a  -t table1 -f fichier.backup mabase

et ca me sort un dump avec (entre autre) ceci :

COPY table1  (col1, col2) FROM stdin;

C'est ti pas un peu bizare? lol
Quand je vous dis que je n'y comprend rien wink

ma config : postgres 9.0.4 sous windows

Je vais voir coté copy, je n'ai jamais utilisé cette commande.

Merci pour ta réponse en passant smile

Dernière modification par giova (23/09/2011 17:09:22)

Hors ligne

#4 23/09/2011 17:14:37

Marc Cousin
Membre

Re : mission impossible? dump de tables

non, en fait from stdin, ça veut dire de prendre ce qui est envoyé dans la sortie standard, c'est à dire les lignes en dessous, jusqu'à la ligne qui ne contient que «\.»

Il faut regarder la doc de la commande COPY: http://docs.postgresql.fr/9.0/sql-copy.html


Marc.

Hors ligne

#5 23/09/2011 17:49:45

giova
Membre

Re : mission impossible? dump de tables

ok merci.

Bon, il semble en fin de compte qu'il n'y ait pas de solution simple :

Copy c'est visiblement pour une seule table, donc un fichier par table (je me trompe?) , ca ne me convient pas du tout !

pg_dump, j'ai enfin réussi à avoir un dump presque parfait avec:
- juste des insert
-des "SELECT pg_catalog.setval" pour les index
- des "DISABLE / ENABLE TRIGGER" avant/apres chaque table

Par contre, pas de truncate, et j'ai beau lire et relire la doc de pg_dump, ca semble juste impossible avec pg_dump, vous confirmez?
Egalement, ca m'oblige dans ma ligne de commande pg_dump,  à spécifier chaque table et dans le bon ordre, il faudra faire bien gaffe quand je ferai évoluer ma bdd ...

Je vous refile la ligne de commande pour pg_dump :

pg_dump.exe -i -h 127.0.0.1 -p 5432 -F p --inserts --disable-triggers -a -t table1 -t table2 -t table3 -U utilisateur  -f  monfichier.backup LaBdd

Dernière modification par giova (23/09/2011 17:52:22)

Hors ligne

#6 23/09/2011 19:14:07

gleu
Administrateur

Re : mission impossible? dump de tables

Au lieu d'un TRUNCATE, vous pouvez lui demander de supprimer la table (option -c). Par contre, il faut dans ce cas enlever l'option -a car la table doit être recréé après suppression. Cela vous donnera un script du style :

DROP TABLE t1;
CREATE TABLE t1...;
COPY t1 FROM stdin;
...

Guillaume.

Hors ligne

#7 24/09/2011 07:30:09

giova
Membre

Re : mission impossible? dump de tables

J'avais essayé cette solution, le probleme dans ce cas (et c'est logique vous me direz), c'est que le dump contient des lignes pour recréer les séquences. J'ai alors pendant la restauration plein d'erreurs me disant que les contraintes existent déjà...

Du coup, je me demande si il n'y aurait pas quelque chose de malsaint dans ce que je veux faire.

Est ce sale, que de vouloir générer/executer des scripts qui ne font que des truncate/insert ?
Je souhaite vraiment éviter d'en arriver à des dumps qui détruisent/reconstruisent ma bdd.

Hors ligne

#8 24/09/2011 09:14:35

giova
Membre

Re : mission impossible? dump de tables

Arg... décidément quelle galère cette histoire de dumps sad
Quand j'execute mon dump j'obtiens l'erreur suivante :

ERREUR:  droit refusé : « RI_ConstraintTrigger_16611 » est un trigger système

car mon dump contient la ligne :

ALTER TABLE matable DISABLE TRIGGER ALL

Moi tout ce que je veux, c'est désactiver les triggers que j'ai ajouté à la table en question, pas les triggers système sad

Il y a vraiment pas moyen en une ligne de commande, de faire un dump juste du contenu de toutes mes tables?
Quelque chose de simple quoi : une ligne de commande = le dump des lignes de table ; une ligne de commande = restitution de ces lignes et des index de table...

Je n'aime pas trop faire de comparatifs, mais avec mysql, si je fais exporter données seulement, j'obtiens le dump souhaité, le tout en 3 clics, et ca fonctionne...

Dernière modification par giova (24/09/2011 09:16:15)

Hors ligne

#9 24/09/2011 16:16:55

gleu
Administrateur

Re : mission impossible? dump de tables

Est ce sale, que de vouloir générer/executer des scripts qui ne font que des truncate/insert ?

Non, c'est juste que ce n'est pas prévu par pg_dump. Ce n'est d'ailleurs pas les seuls manques de pg_dump.

Il y a vraiment pas moyen en une ligne de commande, de faire un dump juste du contenu de toutes mes tables?

Si, "pg_dump -a". Mais le thread a bien expliqué que vous ne vouliez pas que ça.

Quelque chose de simple quoi : une ligne de commande = le dump des lignes de table ; une ligne de commande = restitution de ces lignes et des index de table...

Non, ça n'existe pas. À priori, il y aurait juste besoin d'ajouter la possibilité de tronquer une tables dans pg_dump. Pas une grosse modification en soi à priori.


Guillaume.

Hors ligne

Pied de page des forums