Vous n'êtes pas identifié(e).
Bonjour,
Dans le cadre d un projet utilisant une base de donnees PostgresSQL je dois creer un petit utilitaire permettant de faire:
- un dump des donnees (certaines tables)
- un restaure à partir du fichier dump (.backup)
- un injecte des donnés à partir du fichier dump (.backup)
Pour le dump et restore je n arrive pas a selectionner les tables qui m interressent et voici ce que j ai pour le moment (dump complet)
l option --table table1 table2 ... ne fonctionne pas
dump:
pg_dump --host=$HOST --username="$USERNAME" --role="$ROLE" --format=custom --blobs --section=data $VERBOSE --file="$FILE" $DATABASE
restore:
pg_restore --host $HOST --username "$USERNAME" --dbname "$DATABASE" --role "$ROLE" $VERBOSE "$FILE
pour l'inject je ne sais pas si il existe une méthode simple et generique pour injecter un jeux de données dans une base.
Y a t il des experts en base donnees qui auraient un script tout fait ;-) ou qui pourrait m aider ?
Merci d avance pour votre aide.
Hors ligne
Bonjour,
Pour le dump de vos tables, essayez ça : pg_dump -t "schema.table1" -t "schema.table2"
Hors ligne
Bonjour,
je n avais pas compris le fonctionnement de l option -t: -t table1 table2 ...
ca a l air de fonctionner, merci pour ton aide.
me reste l injection des donnees, as tu une idee ?
D avance merci
Hors ligne
Bin, pareil, option -t. Voir http://docs.postgresql.fr/9.3/app-pgrestore.html pour les détails.
Guillaume.
Hors ligne
pour le restore j utilise la commande pour une injection de data avec l option "-c" pour faire un clean avant.
Par contre dans le cas d un inject (sans clean donc) si une table est vide et qu il n y a rien a injecter la commande s arrete et n essaye pas d injecter les data sur dans les autres tables.
exemple avec table1 et backup vide, et table2 et backup avec data :
1/ backup des tables 1 et 2
2/ clean de la base
3/ inject -t table1 -t table2 a partir du backup 1/
l insert des data n est pas fait dans la table2 et en verbose je n ai pas de message d erreur
Hors ligne
Ce serait tellement plus simple si vous indiquiez les commandes que vous saisissez...
Guillaume.
Hors ligne
elles sont dans le premier post avec pour la selection des tables -t bale1 en plus. j utilise pg restore pour faire "l inject"
Hors ligne
Si vous avez dumpé uniquement les données des tables associées, il est inutile de préciser lors du restore les tables que vous souhaitez restaurer (donc pas besoin des "-t")
Hors ligne
je suis oblige de preciser car certaines tables ne doivent pas etre restaures
J ai un soucis avec l utilisation de pg_restore: lorsque je restore (insert data) j ai une erreur "DETAIL: Key (grp_id)=(1) already exists "
Y a t il une option a utiliser au moment du dump ou du restore pour lui indiquer d incremeter les pk ?
Hors ligne
Pouvez-vous copier les requêtes exactes que vous lancez pour le dump et le restore (pas comme sur le premier post).
Car normalement le dump contient les pk donc pas besoin d'incrémenter vous même.
Hors ligne
dump des données:
/usr/bin/pg_dump --host=$HOST --username="$USERNAME" --role="$ROLE" --format=custom --blobs --section=data $VERBOSE --file="$FILE" $DATABASE -t "$TABLE1" -t "$TABLE2"
restore des données (injection sans clean TABLE1 avec primary key):
/usr/bin/pg_restore --host $HOST --username "$USERNAME" --dbname "$DATABASE" --role "$ROLE " $VERBOSE "$FILE" -t "$TABLE1" -t "$TABLE2"
Merci pour votre aide
Dernière modification par devjava83 (29/01/2014 19:23:28)
Hors ligne
Si vous avez un soucis avec les PK, c'est que la table existe déjà et qu'elle contient des données.
Guillaume.
Hors ligne
>> Si vous avez un soucis avec les PK, c'est que la table existe déjà et qu'elle contient des données.
merci d avoir pris le temps de repondre.
pg_restore permet d'insérer des données provenant d une autre base. le PK est incrémenté automatiquement.
lors de la restoration d un backup provenant d une autre base il se peut que les PK soient identique alors que les donnees ne le soient pas.
Je cherche une option ou une autre facon d'inserer/merger des donnees sans tenir compte des PK par l utilisation d un auto incremente comme lors d un insert
Hors ligne
Nous savons ce qu'est pg_restore, l'usage que vous en faites par contre ne semble pas être cohérent.
Les PK ne sont pas incrémentées automatiquement puisque que le dump contient la PK en dur.
Si des données sont déjà présentes dans votre table, il vous faut donc les enlever ou alors modifier les inserts du dump pour enlever les PK écrites en dur.
Hors ligne
lors de l insert des donnees les PK sont incremetes automatiquement ?
Comment se fait il que le restore n ai pas une option pour faire de meme ? je precise que je fait un dump des data.
Le restore sans l option -c insert des data, cela veut alors dire que la commande ne gerer pas le cas ou il y a une PK identique (bug ou evolution ?)
Hors ligne
Ce n'est ni un bug ni une évolution nécessaire, lorsque vous dumpez vos données, il est spécifier la PK existante dans la base source.
Lorsque vous réinsérez ces données, il ne va pas changer la PK car sinon les données ne seront plus cohérentes avec la source initiale.
Il faut comprendre que les données que vous insérez ne sont pas considérées comme de nouvelles données mais bien comme des données figées donc avec une PK figée.
Hors ligne
Peut on au moment du dump executer une filtre SQL. Par exemple:
recuperer les donnees dont la valeur est > X (je souhaite verifier les pk) ?
Merci d avance
Hors ligne
Vous ne pouvez pas faire ça avec pg_dump.
COPY vous permet par contre de faire quelque chose de ce type (cf http://www.postgresql.org/docs/9.3/stat … copy.html)
Hors ligne
merci pour le lien. j ai trouve COPY apres avoir poste mon dernier message.
J ai egalement trouve quelque chose de tres insteressant si cela fonctionne avec pg dump
-- Backup recently updated tables based on auto analyze date
SELECT 'pg_dump ' || ' -h localhost -p 5432 -U postgres -F c -b -v -f "/pgbak/somedb_keytbls.backup" ' ||
array_to_string(ARRAY(SELECT '-t ' || schemaname || '.' || relname
FROM pg_stat_user_tables
WHERE last_autoanalyze > ( CURRENT_TIMESTAMP - (INTERVAL '1 day') ) )
, ' ') || ' somedb'
Pernet d ajouter un filtre SQL au pg dump. l objectif est de ne pas dumper toute la base mais selon les donnees de la journee par exemple
Par contre je ne sais pas comment l adapter avec mon schema.
Je dois dump 5 tables et le filtre sur la date est a appliquer sur le timstamp de la view.
Dans cet exemple on ne selectionne qu une seule table alors que moi je veux pouvoir appliquer le filtre sur toutes mes tables.
si je fait un SELECT * FROM toutes mes tables le resultat sort sous forme d un seul tableau ?
Hors ligne
Dans votre exemple vous aurez autant de "-t nom_schema.nomtable" que de tables ayant eu un autoanalyze dans la journée. Je ne comprends pas très bien la question, vous voulez récupérer les noms de tables en filtrant sur le contenu d'un champ dans chacune de ces tables ?
Julien.
https://rjuju.github.io/
Hors ligne
Voici les fonctionnalités que je souhaite développer:
- faire un dump d une base de données contenant beaucoup de données
au vu de la taille important des donnees: extraire sous forme d un fichier .backup les données enregistrées dans une periode de temps
- faire un restore des donnees backupees
Injecter les donnees sans faire un clean au prealable
Le but etant lors de test manuels de pouvoir sauvegarder les donnees en base dans un .backup puis les restaurer dans une autre base pour pouvoir les exploiter/analyser.
Hors ligne
Il doit être possible de modifier le code source de pg_dump pour faire cela. En tout cas, la version actuelle ne le fait pas.
Par contre, le vrai soucis n'est pas là. Il est plutôt à la restauration. Si vous faites des restaurations partielles et que vous avez des clés étrangères, il est possible que les données ne soient pas toutes restaurables.
Guillaume.
Hors ligne
Les commandes pg_dump et restore ne sont pas adaptées à ce que je veux faire.
Cela devrait etre possible en SQL.
Merci pour votre aide
Hors ligne