Synchronisation entre deux bases de données (Access/Mysql)

La première phase de mon stage consiste à mettre en place un script, un programme, qui permettra de synchroniser une partie de la base de données CIEL (qui contient l'ensemble des articles, famille, fournisseur, ventes, etc...) avec la base de donnée du site (Mysql).

CIEL repose sur une base de données ACCESS, le script devra donc être capable d'effectuer des requêtes sur cette base de données. La synchronisation est unidirectionnel (Ciel -> Site) lorsqu'il s'agit des articles, et bidirectionnel lorsqu'il s'agit des stocks.


Voici donc la façon dont j'effectue la synchronisation (dans cet exemple pour les articles).

Le serveur web du magasin accueil un mini-site, qui effectue via des requêtes AJAX les différents traitements de synchronisation. Le dialogue entre les deux serveurs s'effectue exclusivement en JSON, plus léger que XML et très facilement lisible en cas de debuggage.

Les requêtes AJAX envoyées depuis le serveur web du magasin peuvent être dirigées :

  1. soit vers un script php interne au serveur qui va permettre de créer un interface entre les données de la base de donnée ACCESS et le reste de l'application
  2. soit vers un script php "proxy" qui va effectuer une requête POST sur le serveur web e-commerce et retournera le résultat de cette requête. La requête POST ne contient qu'un seul champs : "data". Ce champs "data" - qui sera envoyé au serveur e-commerce - contient l'intégralité des variables POST ($_POST) envoyées au script proxy. Ainsi, le mini-site envoie une requête AJAX de type POST sur le script "proxy", le script proxy transforme toutes ces variables en JSON (serialisation) et les inclus dans la variable "data" qu'il envoi par POST au serveur web e-commerce, le serveur web e-commerce va alors déserialiser la variable $_POST['data'] et effectuer les traitements en fonction des paramètres transmis.


Ps : J'utilise CURL pour l'envoi de requête POST sur le serveur ainsi que PDO pour la communication avec la base de donnée ACCESS.

7 commentaires:

Ajoutez un commentaire via Google Friend Connect...
...ou en utilisant les commentaires standards sous Blogger...

Je suis en stage en entreprise et je dois réaliser une synchronisation entre deux bases MySQL et je rame complètement. Comment a tu géré les modifications et suppression d'une base pour qu'il n'y ai pas d'incohérences?

mercredi, 27 mai, 2009

baba

La il ne s'agit pas de synchronisation entre 2 bases Mysql mais entre une base Access et une base Mysql. De plus le script ne concernait qu'une table (donc pas besoin de se soucier des clés étrangères ...). J'ai déjà lu que Mysql disposait de mécanisme de synchronisation, Google devrait t'aider :)

mercredi, 27 mai, 2009

François-Guillaume Ribreau

Je n'ai qu'une seule table a gérer des deux cotés aussi, j'ai pas mal fouillé déjà et fait quelques essais, mais je me retrouvait soit avec des incohérences soit avec une table "poubelle" qui restaurait les fichiers supprimés et n'écrasait pas en cas de modification gardant toutes les versions d'un même fichier car je n'avais pas de moyen de déterminer lequel était le bon...

mercredi, 27 mai, 2009

baba

Tu es aller voir ici : http://dev.mysql.com/doc/refman/5.0/fr/replication.html ?

mercredi, 27 mai, 2009

François-Guillaume Ribreau

Je ne veut pas juste envoyer les donnée de l'un à l'autre, pour faire simple transfert ou une copie.Disons que j'ai un serveur et un client, qui au départ possèdent une base identique, connexion coupée pendant 2 jours, les deux on subits différentes modifications, ajouts et suppressions, tous les ajouts doivent donc être copié dans les deux, les éléments supprimés restaurés s'ils n'ont pas été supprimés depuis le maître (qui est le client d'ailleur ) mais être marqués sur le client pour être supprimés sur le serveur à la synchronisation. Pour ce qui est des modifications idéalement les conflits auraient été réglé en prenant en compte le plus récent, mais l'on se contentera de garder la version du maître pour ne pas trop compliquer les choses. Par réplication j'ai trouver comment copier un contenu sur l'autre, mais pas vraiment comment les synchroniser.

mercredi, 27 mai, 2009

baba

Pour chaque table d'une DB d'A :
"tous les ajouts doivent donc être copié dans les deux" récupére les lignes différentes entre la table A de la DB A et la table B de la db B

"tous les ajouts doivent donc être copié dans les deux" boucle sur les tuples de la différence et réalise des insert into dans l'autre table/base de données

Après ça "les éléments supprimés restaurés s'ils n'ont pas été supprimés depuis le maître (qui est le client d'ailleur )" c'est simplement des "IF" sur chaques ajouts.

En y allant tranquillement, il n'y a rien de bien compliqué.

OU alors (autre méthode qui me vient à l'esprit, mais qui n'est pas très optimisée):

Boucle sur les tables de la bdd A
---Boucle sur les champs de la table en cours (appellons la X)
-----Si présence de l'ID dans BDD B table X
--------Si différence entre l'entrée Y entre la table X de la BDD A et B
-----------Quel entrées est la plus récente ?
-----------etc...
-----Sinon
-------- Ajout dans BDD B

Etc...C'est vraiment pas compliqué, il suffit de prendre son temps.

mercredi, 27 mai, 2009

François-Guillaume Ribreau

Un grand merci, je m'y met et je te dis si j'ai réussi

mercredi, 27 mai, 2009

baba