IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Synchronisation de BDD [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par défaut Synchronisation de BDD
    Bonjour à tous,

    J'aimerais savoir si il existe une fonction (requête) permettant la synchronisation entre base locale et une base distante, de la même manière que l'onglet de synchronisation de phpmyadmin ?

    Pour un projet je dois effectuer cette synchronisation via une API C++, et n'ayant pas envie de me tuer le cerveau avec des tas de requêtes de récupération, comparaison, delete etc, je cherche un moyen simple, efficace et sûr de le faire.

    Si il n'existe pas de requêtes pour cela, est-il possible de créer un fichier, faisant cela automatiquement ? Je m'explique :

    Au niveau de mon API, je clique sur un bouton pour synchroniser, qui m'ouvre la page de phpmyadmin, et si je peux passer par un fichier, j'aimerais qu'il aille directement dans l'onglet de synchronisation, qu'il choisisse la base source, la base cible, et qu'il remplisse les champs avant d'éxécuter.
    Un genre de "robot" quoi.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    regarde du coté de rsync

  3. #3
    Membre Expert Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Par défaut
    Citation Envoyé par chapitre37 Voir le message
    Au niveau de mon API, je clique sur un bouton pour synchroniser, qui m'ouvre la page de phpmyadmin, et si je peux passer par un fichier, j'aimerais qu'il aille directement dans l'onglet de synchronisation, qu'il choisisse la base source, la base cible, et qu'il remplisse les champs avant d'éxécuter.
    C'est marrant ça. Ton "API" elle fait pas de synchro en fait, elle fait juste client Web....

    Sinon, tu peux très bien analyser cette page de phpmyadmin avec les noms des champs que tu veux renseigner et juste faire en sorte que ton "API" envoie une requête HTTP avec toutes les données postées qui vont bien pour que phpmyadmin fasse tout le boulot...

    Je reste dubitatif sur la solution d'une "API" qui utiliserait PhpMyAdmin....

  4. #4
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par défaut
    Je doute qu'il soit utile de jouer sur les mots, mon API communique avec ma base de données sur phpmyadmin, et donc en cliquant sur le bouton, ça ouvre la page localhost/phpmyadmin.

    Bref, le truc qui me fait douter, c'est que phpmyadmin est en javascript, étant donné que je n'y connait pas grand chose (voir rien du tout), je le sens pas super, d'où l'idée d'un genre de "robot" qui simulerait des clics souris etc.

    Pour le fait que tu sois dubitatif, ne le sois pas, C++ Builder XE2 a une bibliothèque intégrée (dbExpress) pour la gestion de données. J'ai créé un lien ODBC pour faire la liaison entre Builder et phpmyadmin, et ça marche niquel, on envoie, on lit, on delete etc.

  5. #5
    Membre Expert Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Par défaut
    Ah mais tu confonds ta base de données(MySQL en l'occurence) et PhpMyAdmin c'est pour ça....

    Une connexion ODBC se fait sur une base de données.
    PhpMyAdmin n'est pas une base de données mais un interface de gestion pour cette base.

    Se connecter à la base via ODBC ou un driver n'a rien à voir avec lancer des commandes via PhpMyAdmin.

    Et pourquoi ne pas utiliser les commandes natives de mysql pour faire des exports/imports? Ca sera plus propre...

  6. #6
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par défaut
    Les imports/exports ne génèrent que des fichiers .sql il me semble, or je cherche simplement à ce que le contenu de la base locale qui est différent de la base distante, y soit envoyé, afin que la base distante soit à jour et pouvoir effacer le contenu de la base locale pour l'alléger.

    Après je ne connais pas à 100% les fonctionnalités des commandes natives de MySQL, donc si il est possible de simplement ajouter les données de la base locale, qui ne sont pas sur la distante, je suis preneur.

  7. #7
    Membre Expert Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Par défaut
    Et la réplication ça correspondrait au besoin ?

  8. #8
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    or je cherche simplement à ce que le contenu de la base locale qui est différent de la base distante, y soit envoyé, afin que la base distante soit à jour et pouvoir effacer le contenu de la base locale pour l'alléger.
    Ce ne serait pas plutôt l'inverse ?
    Récupérer les données de la Bdd distante et mettre à jour la Bdd locale ?

    Peu importe finalement.
    Si tu veux interroger la Bdd distante il faut d'abord que celle-ci autorise un accès distant.
    Faut voir ça avec ton hébergeur (certains mutualisés l'autorisent, faut juste l'activer, après c'est à ses risques et périls, si c'est un dédié tu dois pouvoir le faire).

    Après ça ce n'est qu'une histoire de paramétrage.
    Faut voir quels sont les types de connexion que te propose ton application, quels drivers MySQL utiliser (il peu en avoir plusieurs), il doit même être possible de le faire via ODBC par exemple (mais un drivers mysql serait mieux à mon sens).


    Une fois la connexion établie (si c'est possible), il faudra faire toutes les requêtes SQL que tu veux.
    Je ne sais pas si c'est cela que tu recherches.


    Si une connexion distante n'est pas autorisée, à part créer un WebService je ne voit pas d'autres solutions.

  9. #9
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par défaut
    Tout ce que tu viens de dire, c'est déjà fait, j'arrive à faire tout ce que je veux, que ça soit sur la base locale ou bien la base distante.

    Etant donné que nos données sont obtenues directement sur le PC de la base locale, il faut pouvoir mettre la base distante à jour, en y ajoutant les données qu'elle n'a pas par rapport à la locale.

    Pour ce faire, l'interface de phpmyadmin propose de synchroniser les deux de la manière qui nous intéresse, je souhaite donc savoir s'il est possible d'effectuer cela de manière automatique, sans devoir passer par tout un tas de requêtes de comparaisons (pour savoir quelles sont les données qui diffèrent d'une base à l'autre), et de requêtes d'insertion.

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    regarde du coté de rsync
    sinon http://dev.mysql.com/doc/refman/5.0/fr/replication.html

  11. #11
    Membre Expert Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Par défaut
    J'ai l'impression que tu lis pas les idées qu'on te donne....

    T'as plusieurs choix :
    - réplication (à valider si ça colle vraiment au besoin)
    - rsync
    - dump

    La solution d'automatiser la synchro PhpMyAdmin ne me semble pas très propre.

    Quelles sont tes contraintes sur ces 2 bases? Peux-tu envisager un arrêt de service sur la base distante ?
    Si oui, le plus simple serait peut-être de dumper la base locale (sql_dump) et import du dump sur la base distante. Par contre ça implique d'arrêter la base distante.

  12. #12
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par défaut
    Si je ne me trompe pas, la réplication est faite pour que les deux bases soient exactement pareilles.

    Et ça n'est pas ce que je veux.

    Je vais faire un exemple tout simple :

    Base de données locale (L) : 10 mesures.
    Base de données distante (D) : 0 mesures.

    A la première synchronisation, je veux que les 10 mesures de L soient copiées sur D.

    Ensuite, j'effectue environ 40 mesures supplémentaires, donc il y en a 50 au total sur L.

    A la deuxième synchronisation, je veux que les 40 nouvelles mesures, qui ne sont pas sur D, y soient copiées, sans effacer les 10 premières, il y en a donc 50.

    Ensuite, j'efface le contenu de L pour rafraîchir le tout.

    J'effectue de nouveau 50 mesures, donc L = 50 (rappel : il y a les 50 mesures d'avant sur D).

    A la troisième synchronisation, les 50 dernières mesures ne sont pas sur D, je souhaite donc les y ajouter, de manière à ce qu'il y ait au total 100 mesures.

    Et ainsi de suite.

    En résumé, quel que soit le contenu de L, je veux que les mesures sur L, qui ne sont pas présentes sur D, le soient à la synchronisation. (L est en gros une base "alpha", D est la base générale, sur laquelle sera enregistrée chacune des mesures)

  13. #13
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    je vois, en réplication ça doit être possible, il suffit de bien gérer les droits

  14. #14
    Membre Expert Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Par défaut
    C'est marrant je ne pensais pas que c'est ce que faisait la fonction synchroniser de PhpMyAdmin....

    Comment gère t'il les clés primaires qui j'imagine doivent se chevaucher entre tes nouvelles données sur la base locale et les données existantes de la base distante...

    Sinon via un code custom, tu dois pouvoir extraire facilement tes données pour les renvoyer vers la nouvelle base.
    Ca sera toujours plus propre que simuler un clic dans PhpMyAdmin...

  15. #15
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par défaut
    Pour la réplication je vais regarder ça, mais je connais pas trop les fonctions liées à ça, par contre au niveau des droits c'est bon, j'arrive déjà à faire ce que je veux sur la distante.

    Au niveau de la synchronisation, vu que ça copie les données de la base locale qui ne sont pas présentes sur la distante, les ID sont les mêmes.
    Même si on vide régulièrement le contenu de la locale, les ID ne se réinitialisent pas, donc il n'y a jamais de doublons, l'incrémentation continue.

    Je peux faire une synchronisation "manuelle" via requêtes etc, mais vu que c'est super galère car je dois gérer si dans les données de la locale il y en a qui sont déjà dans la distante ou non, je dois vérifier plusieurs trucs avant de copier le tout. D'où ma recherche sur les possibilités de faire ça plus simplement.

  16. #16
    Membre Expert Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Par défaut
    Alors si tu es sûr que tous les éléments de ta base locale ne sont pas dans ta base distante, tu peux effectuer un dump de données de ta base locale que tu réimportera dans ta base distante.

    Par contre si tu as des ajouts d'enregistrements des 2 côtés avec des doublons d'ID (mais des données différentes!!!), tu prends des risques avec PhpMyAdmin aussi d'ailleurs.

    Le plus propre serait d'implémenter dans ton appli un système d'export/import qui exporte un csv avec le contenu de la base (sans les ID techniques !!!) et l'import de csv qui recrée des enregistrements dans ta base en créant de nouveaux ID.
    Tu exportes ce csv de ta locale et tu importes ce csv sur ta distante.

  17. #17
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par défaut
    Pour les ID, je suis certain qu'il n'y a aucun doublon, même après un DELETE d'une des deux bases, le dernier ID qui était enregistré, est gardé en mémoire, et la prochaine ligne insérée, prends l'ID d'après, donc de ce côté pas de soucis (surtout que lorsque le projet sera mis en place, les deux bases seront "propres", donc commenceront toutes les deux à 1).

    Concernant le contenu des bases, c'est justement ce qui fait que je n'essaye toujours pas ce que vous me proposez, il est tout à fait possible qu'après une synchronisation de la base locale vers la base distante, le contenu de la locale ne soit pas effacé.
    Il faut donc que lors de la prochaine synchronisation, seul le "nouveau" contenu de la base locale, soit envoyé vers la distante.

    Ce que la fonction de synchronisation de phpmyadmin réussi très bien (il y a plusieurs paramètres possibles, et celui qui m'intéresse est celui par défaut), d'où mon insistance concernant cette fonctionnalité.

    Mais bon, le collègue avec qui je travaille, s'est tapé toutes les lignes de requêtes à effectuer pour tester les différences etc, afin de synchroniser correctement (ce qui représente pas loin de 300 lignes), on a en plus dû palier à un problème de date, récupérer les dates enregistrées sur la BDD nous donnait une date en format européen, tandis que sur la BDD, il faut un format anglo-saxon, donc décomposer la date lors de la récupération, l'assembler dans le bon ordre sur le programme, et renvoyer le tout etc ...

    Enfin bref, si jamais il y a tout de même une possibilité de faire comme je le demandais sur ce topic, je suis preneur, sinon je mettrais comme résolu et on se contentera des blocs de requêtes à la pelle.

  18. #18
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    300 lignes pour comparer si une id est présente ou pas?

    sachant que vu ta gestion des choses:
    • la suppression des lignes de L se fait SANS utiliser un truncate (qui remettrait id à 0)
    • max(id) sur D< max(id) sur L


    prenons la démarche à faire :
    • connexion à L
    • connexion à D
    • on récupère max(id) de D
    • on récupère les ligne de L pour id>max(id) de D
    • on insère ces lignes sur D

    ceci marche si et seulement si D est bien une sauvegarde périodique de L

  19. #19
    Membre Expert Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Par défaut
    Citation Envoyé par chapitre37 Voir le message
    Pour les ID, je suis certain qu'il n'y a aucun doublon, même après un DELETE d'une des deux bases, le dernier ID qui était enregistré, est gardé en mémoire, et la prochaine ligne insérée, prends l'ID d'après, donc de ce côté pas de soucis (surtout que lorsque le projet sera mis en place, les deux bases seront "propres", donc commenceront toutes les deux à 1).
    Cela ne fonctionne que si la base distante n'est jamais modifiée exceptée par la synchro tu confirmes?

  20. #20
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par défaut
    Désolé de ne répondre que maintenant, la synchro est finie. On s'est contenté des comparaisons pour détecter les différences entre les bases, et mettre à jour ce qui n'est pas présent.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Synchroniser deux bdd Sql server et mysql
    Par youcef81 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 01/03/2012, 12h18
  2. Comment synchroniser une BDD MySQL avec une BDD SQLite?
    Par newjc dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 29/07/2009, 12h22
  3. [AJAX] Listes déroulantes synchronisées sur bdd
    Par Hefgé dans le forum Général JavaScript
    Réponses: 48
    Dernier message: 13/03/2009, 14h53
  4. Synchroniser deux bdd
    Par david06600 dans le forum Toad
    Réponses: 4
    Dernier message: 10/01/2008, 09h11
  5. [SQL2005-VS2005] Synchronisation de bdd
    Par toniolol dans le forum Accès aux données
    Réponses: 1
    Dernier message: 05/06/2007, 07h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo