Vous n'êtes pas identifié(e).
Pages : 1
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
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
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?
Quand je vous dis que je n'y comprend rien
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
Dernière modification par giova (23/09/2011 17:09:22)
Hors ligne
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
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
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
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
Arg... décidément quelle galère cette histoire de dumps
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
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
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
Pages : 1