Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/05/2007, 17h50   #1
Invité de passage
 
Inscription : février 2007
Messages : 10
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 10
Points : 1
Points : 1
Par défaut Postgres et synchronisation de tables

Bonjour à tous.

J'ai un soucis de synchronisation de tables avec Postgres.

J'ai une table (appellons la table_1) qui contiennent plusieurs millions de lignes et une autre table dans une autre base (table_2) qui reprends toutes les lignes de la table_1 mais pas toutes les colonnes (juste quelques unes).

J'aimerai faire que les modifs faites sur les lignes de ma table_1 soient répercutées sur ma table_2.

J'ai déjà un processus qui fait ca : un batch lancé toutes les 15 minutes (je n'ai pas besoin que ce soit forcément instantané) qui va répercuter les modifications en fonction d'une colonne date_de_mise_a_jour. Ce batch ne fait que récupérer les données des lignes mises à jour depuis le dernier lancement du batch et répercute les changements. Ca marche plutôt bien et ca traite quelques dizaines de milliers de lignes toutes les 15 minutes.

Mon soucis c'est que si je suis amené à lancer une procédure sur ma table_1 qui fait un traitement assez important, il se peut que cette procédure mette plus de 15 minutes à se lancer! Hors, comme vous le savez, quand on lance une procédure, la fonction now() retourne la date au lancement de la procédure; du coup les lignes en question ne sont pas synchronisées car, lorsque le batch se lance, il ne prends pas ces lignes en compte vu qu'elles ont été mises à jour il y a plus de 15 minutes.

Du coup je cherche un moyen plus intelligent de faire cette synchronisation.

Je pensais utiliser dblink mais ca n'est pas très concluant car ca m'oblige à faire des requêtes très lourdes pour faire la jointure et je ne souhaite pas utiliser Slony.

Avez-vous une idée à me soumettre? ^^
vivi_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2007, 22h24   #2
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
Bonsoir,

au lieu d'utiliser un cron, pourquoi ne pas faire un trigger ?
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2007, 23h51   #3
Membre chevronné
 
Avatar de gerald2545
 
Inscription : février 2003
Messages : 643
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 643
Points : 660
Points : 660
avec un trigger tu ne peux pas accéder à une autre base de données? je me trompe?
Sinon, dans ta base 1 tu crées une table équivalente à ta table_2 de la base_2 qui te sert de transfert. A chaque fois qu'un enregistrement est inséré dans ta table_1 (base_1) tu inséres les données qu'il te faut dans table_2 (base_1) et tu lances ton cron sur le contenu de table_2 (base_1) dont tu supprimes les enregistrements copiés en fin de manip?
non?
gerald2545 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2007, 07h34   #4
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
Si tu peux faire un trigger sur une autre base, mais c'est de la bidouille plus qu'autre chose, mais ca marche, je l'ai utiliser pour une appli qui tourne encore tres bien.

Pour la deuxieme partie, je te suis pas trop bien (de bon matin au reveille, j'ai un peu de mal !)
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2007, 07h58   #5
Membre chevronné
 
Avatar de gerald2545
 
Inscription : février 2003
Messages : 643
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 643
Points : 660
Points : 660
je te laisse relire un coup après ton café ou tu veux plus de détail?
je propose ça mais je n'ai jamais fait.....donc c'est juste une idée
gerald2545 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2007, 09h57   #6
Invité de passage
 
Inscription : février 2007
Messages : 10
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 10
Points : 1
Points : 1
Citation:
Envoyé par gerald2545
Sinon, dans ta base 1 tu crées une table équivalente à ta table_2 de la base_2 qui te sert de transfert. A chaque fois qu'un enregistrement est inséré dans ta table_1 (base_1) tu inséres les données qu'il te faut dans table_2 (base_1) et tu lances ton cron sur le contenu de table_2 (base_1) dont tu supprimes les enregistrements copiés en fin de manip?
non?
Et bien c'est une bonne idée mais j'aimerai éviter de créer une table "temporaire" parce que ma table_2 de ma base_2 à un équivalent sur une base_3, une base_4, etc ^^ En fait la table que j'essaie de dupliquer est une table qui contient les infos des comptes de mes utilisateurs et les tables répliquées contiennent les lignes pour une application (et un serveur) donné. Donc si j'ai mettons 10 applications, ca me fait 10 tables temporaires
vivi_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 09h17   #7
Invité de passage
 
Inscription : février 2007
Messages : 10
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 10
Points : 1
Points : 1
Up

Sait-on jamais.
vivi_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 10h06   #8
Membre actif
 
Avatar de budtucker
 
Développeur multimédia
Inscription : avril 2007
Messages : 175
Détails du profil
Informations professionnelles :
Activité : Développeur multimédia

Informations forums :
Inscription : avril 2007
Messages : 175
Points : 174
Points : 174
Salut,

Est ce que les changements dans ta base 1 sont assez fréquents (plus d'une centaine de fois par minute) ? Si oui, il est clair qu'un trigger ferait ramer Postgre.

Pour une table faisant 1 million d'occurence, faire un export, c'est pire. Une table tempo risque de rendre le traitement lent, mais ça peut marcher.

Cependant, je préconise tout de même le Trigger. D'une part c'est plus propre [qu'un cron] et d'autre part, tout est centralisé à un seul endroit : Postgre.

Un Trigger entre 2 bases se fait par l'intermédiaire de dblink.
A+
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 10h43   #9
Invité de passage
 
Inscription : février 2007
Messages : 10
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 10
Points : 1
Points : 1
Effectivement les changements dans ma table sont très fréquents On dois effectivement dépasser les 100 modifications par minute.

Je vais faire des tests via dblink mais ce que je n'aime pas trop dans ce dernier c'est que je dois systématiquement fournir une requête et préciser le type de chaque champ J'aimerai bien remplacer ma table_2 par une vue mais j'ai beaucoup de colonnes dans ma table d'origine et j'ai peur qu'utiliser dblink soit super contraignant dans ce cas précis.
vivi_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 12h07   #10
Membre actif
 
Avatar de budtucker
 
Développeur multimédia
Inscription : avril 2007
Messages : 175
Détails du profil
Informations professionnelles :
Activité : Développeur multimédia

Informations forums :
Inscription : avril 2007
Messages : 175
Points : 174
Points : 174
C'est clair, que si tu as beaucoup de colonne, ça risque d'être long. Mais tu peux très bien (faut voir si c'est possible dans ton cas) générer la liste des colonnes en batch dans une fonction qui renvoie un "record". La solution devrait être ça je pense. Tu créé ta requête SQL et ta "tonne" de colonne directement dans une boucle "for". La liste des colonnes sera à reccupérer dans les catalogues. Dans un "execute", tu lances la requête générée et tu renvoie pour chaque ligne le resultat que tu souhaites. Ensuite, en fonction de ce résultat, tu peux faire tes vérfications et éventuellement tes ajouts dans la nouvelle base.

L'avantage, c'est que ce n'est pas de la "bidouille" puisque l'on utilise 100 % de Postgre. L'avantage encore est que tu n'utilises qu'un seul processus : celui de Postgre.

Raconte nous au fur et à mesure....

A+
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 16h53   #11
Membre éclairé
 
Avatar de icer
 
Inscription : janvier 2006
Messages : 332
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 332
Points : 308
Points : 308
ça te fait pas mal d'information dupliquées donc une baisse de l'intégrité de tes bases...

Pourquoi est-ce que tu n'utilise pas la même base de données pour tes différentes applications ?
icer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 18h35   #12
Invité de passage
 
Inscription : février 2007
Messages : 10
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 10
Points : 1
Points : 1
Citation:
Envoyé par icer
ça te fait pas mal d'information dupliquées donc une baisse de l'intégrité de tes bases...

Pourquoi est-ce que tu n'utilise pas la même base de données pour tes différentes applications ?
Pour décharger le serveur de bado en question justement!

On a pas mal de serveurs web pour différentes applications et cette base est la base "commune" on va dire. Et c'est ingérable que tout les serveurs tapent le dit serveur sinon il monte tout de suite en load. Du coup on a décidé de faire cette sorte de copie "light" pour chaque appli; ca marche plutôt pas mal.

L'idéal serait de répliquer la base en question sur plusieurs serveurs et faire un systeme de load balancing mais on manque un peu de serveurs ^^
vivi_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h09.


 
 
 
 
Partenaires

Hébergement Web