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

Administration MySQL Discussion :

Comparer deux BDD et mettre à jour les données manquantes


Sujet :

Administration MySQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juillet 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Comparer deux BDD et mettre à jour les données manquantes
    Bonjour,


    J'aimerais savoir s'il est possible de comparer deux BDD MySQL avec une certaine commande SQL, perso je n'ai pas trouvé :/ puis enfin de mettre à jour la table où il manque des données.


    Dans mon cas j'ai deux bases de données que je synchronise en temps réel avec une architecture maitre/maitre. Et en fait en cas de panne, si le serveur primaire tombe, le secondaire fonctionne toujours et sa base de données se remplit. Lorsque le serveur primaire est réparé, il aura une différence de données avec le secondaire :/ et j'aimerais donc comparer les deux bases et mettre à jour le primaire pour qu'il ajoute les données manquantes.

    Car je sais qu'il est possible de faire un dump et de remettre sur le primaire mais cela stoppe la base (lock les tables) pendant genre 3-4h (mes BDD font environs 12Go) ou alors un clone de la machine (clonezilla) et remettre sur le primaire aussi lol mais interruption des services aussi :/


    Merci pour vos idées

  2. #2
    Membre extrêmement actif Avatar de ddoumeche
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    Octobre 2007
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Singapour

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 676
    Points : 2 009
    Points
    2 009
    Par défaut
    Regardes la documentation de http://mysql-mmm.org/, http://codership.com/content/using-galera-cluster, et surtout http://www.percona.com/software/percona-xtradb-cluster

    L'idée, si tu as deux (ou+) maitres/maitres, est de configurer la réplication pour démarrer manuellement, puis en cas de arrêt/indisponibilité d'un des serveurs :
    - rétablir le service
    - restaurer l'intégrité des données (même si tu perds quelques transactions)
    - relancer la réplication
    - pendant que le(s) survivant(s) assure(nt) la continuité du service
    - sauf si la cause du plantage est une requête de modification qui s'est répliquée (argh)

    Ca ne marche pas dans une VM mais pour mettre un SGBDR dans une VM, il faut être con aussi. Je me permet de le dire car c'était ce que nous avions

    En ce qui concerne le backup, je te conseille de regarder LVM et de bien lire LOAD DATA INFILE.

    Egalement :
    http://fr.slideshare.net/KrisBuytaer...ernatives-2010


    Notons également que Mysql-MMM n'est pas extrêmement populaire et commence à dater, beaucoup moins en tout cas que le sharding, ou que DRDB (mais en cas de crash du serveur répliqué, la reconstruction des données peut être longue)

    Mon sentiment est que Percona XtraDB Cluster est peut-être la solution la plus aboutie.

    Je me permet de te demander de nous faire un retour d'expérience, je suis intéressé.
    La joie de l'âme est dans la planification -- Louis Hubert Liautey

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juillet 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse

    Je vais regarder tes liens. Mais j'ai déjà un cluster de fait entre mes deux serveurs (pacemaker avec heartbeat) donc je ne sais pas si vais pouvoir mettre un autre cluster par dessus.
    Plutôt complexe.

    Sinon une autre idée m'est venue, est il possible de réaliser une sauvegarde BDD par BDD par un script ?
    En revanche je ne veux toujours pas de mysqldump car cela serait encore une fois trop long et cela lock les tables.
    J'aimerais du genre la commande sql qui permet de faire seulement un export à chaud, phpmyadmin le fait très bien en pas longtemps donc cela doit être possible ?

    Car j'ai testé mysql -h localhost -u import_export -ppassword BDD > BDD.sql et cela ne fait rien, obligé de stopper avec Ctrl+C sinon rien ne se passe. Le fichier est bien créé mais vide.

    Savez vous comment faire ?


    Merci

  4. #4
    Membre extrêmement actif Avatar de ddoumeche
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    Octobre 2007
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Singapour

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 676
    Points : 2 009
    Points
    2 009
    Par défaut
    Effectivement, si tu as commencé à réalisé ton prototype, pas la peine de changer de direction, surtout qu'on ne fait pas un cluster sur un autre, cela n'a pas de sens.
    Tu as également remarqué que ce ne sont pas des projets faciles, mais gratifiant

    En ce qui concerne la sauvegarde, il y a plusieurs options :
    • utiliser l'option skip-lock-table et sauvegarder base par base :
      "FLUSH TABLES WITH READ LOCK"
      mysqldump -h<host> ... --skip-opt --quick --allow-keywords --routines --events (--single-transaction si ce ne sont que des tables en InnoDB)
      "UNLOCK TABLES"
      Cela aura l'avantage de ne pas locker les tables en écriture, mais cela reste artisanal et long
      Je pense que c'est la méthode utilisé en interne par phpMyadmin
    • Tu peux tester le SELECT ... INTO OUTFILE (ou mysqldump --tab qui est la même chose), c'est plus rapide mais encore artisanal
    • Si toutes tes tables sont en InnoDB, regardes Xtrabackup
    • le "must" est sans doute LVM, qui est un peu plus compliqué à configurer, mais idéal et très rapide.
    La joie de l'âme est dans la planification -- Louis Hubert Liautey

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par flyght Voir le message
    Bonjour,
    J'aimerais savoir s'il est possible de comparer deux BDD MySQL avec une certaine commande SQL, perso je n'ai pas trouvé :/ puis enfin de mettre à jour la table où il manque des données.
    Avec un autre SGBDR que MySQL ceci serait d'une simplicité enfantine. En effet, tous les SGBDR implémentent la commande MERGE, sauf MySQL.
    MERGE permet de faire simultanément du INSERT, UPDATE ou DELETE par comparaions d'une table à une autre en une seule passe par table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MERGE INTO MaTableCible AS CBL
    USING (SELECT * FROM MatableSource) AS SRC
        ON CBL.MaClef = SRC.MaClef
    WHEN MATCHED THEN UPDATE
       SET COL1 = SRC.COL1, ...
    WHEN NOT MATCHED THEN INSERT
       (SRC.COL1, SRC.COL2,...)
    WHEN NOT MATCHED BY SOURCE THEN DELETE
       WHERE SRC_ID = ...
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre extrêmement actif Avatar de ddoumeche
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    Octobre 2007
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Singapour

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 676
    Points : 2 009
    Points
    2 009
    Par défaut
    Pourquoi faire un merge quand on a une réplication bidirectionnelle ?
    Que l'on va en outre casser en faisant les modifications manuellement.

    Par contre, il n'y a effectivement pas de merge, mais on peut l'émuler simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT  `tableA` AS set, T.*
    FROM    `tableA` T
    WHERE   ROW(T.col1, T.col2, …) NOT IN (
            SELECT * FROM  `tableB`
            )
    UNION ALL
    SELECT  `tableB` AS set, T.*
    FROM    `tableB` T
    WHERE   ROW(T.col1, T.col2, …) NOT IN (
            SELECT  * FROM  `tableA`
            )
    La joie de l'âme est dans la planification -- Louis Hubert Liautey

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juillet 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses


    Une personne d'un autre fofo m'a trouvé ce lien qui a l'air plutôt bien aussi
    http://wiki.pedrono.fr/index.php/MYS...L_%C3%A0_chaud

    Pour au moins réaliser le dump sans lock les tables. Bon maintenant le soucis c'est si des données sont écrites pendant le dump à chaud, je ne sais pas comment le système et la BDD vont réagir.


    Par contre, il n'y a effectivement pas de merge, mais on peut l'émuler simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT  `tableA` AS SET, T.*
    FROM    `tableA` T
    WHERE   ROW(T.col1, T.col2, …) NOT IN (
            SELECT * FROM  `tableB`
            )
    UNION ALL
    SELECT  `tableB` AS SET, T.*
    FROM    `tableB` T
    WHERE   ROW(T.col1, T.col2, …) NOT IN (
            SELECT  * FROM  `tableA`
            )
    Cette requete renverra la différence entre les tables on est d'accord ? et je renverrai donc le contenu de la réponse en INSERT INTO où il manque les données ?

    J'ai trouvé un logiciel qui compare les BDD qui fonctionne bien aussi mais je préfère le faire en ligne de commande quand meme pour le scripter.
    Le logiciel c'est Toad for mysql, plutôt bien fait et simple d'utilisation.


    Merci

  8. #8
    Membre extrêmement actif Avatar de ddoumeche
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    Octobre 2007
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Singapour

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 676
    Points : 2 009
    Points
    2 009
    Par défaut
    Citation Envoyé par flyght Voir le message
    Merci pour vos réponses


    Une personne d'un autre fofo m'a trouvé ce lien qui a l'air plutôt bien aussi
    http://wiki.pedrono.fr/index.php/MYS...L_%C3%A0_chaud

    Pour au moins réaliser le dump sans lock les tables. Bon maintenant le soucis c'est si des données sont écrites pendant le dump à chaud, je ne sais pas comment le système et la BDD vont réagir.
    Ma seconde réponse répondait à cette question :
    * Si tu n'utilises que des tables en InnoDB, faire le dump dans le cadre d'une transaction ce qui garanti l'intégrité des données via l'option --single-transaction
    * si ce n'est pas le cas, il faut locker les tables en écriture comme j'ai précisé précédement

    Lisez la doc, c'est en général plus instructif que les forums.


    Cette requête renverra la différence entre les tables on est d'accord ? et je renverrai donc le contenu de la réponse en INSERT INTO où il manque les données ?

    J'ai trouvé un logiciel qui compare les BDD qui fonctionne bien aussi mais je préfère le faire en ligne de commande quand meme pour le scripter.
    Le logiciel c'est Toad for mysql, plutôt bien fait et simple d'utilisation.

    Merci
    Non. Cette requête permet juste d'isoler les différences éventuelles entre deux tables.
    Si vous avez une réplication, il faut résoudre les éventuels conflits dans le cadre de cette réplication, c'est à dire la relancer et vérifier les éventuels conflits.
    La joie de l'âme est dans la planification -- Louis Hubert Liautey

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/04/2015, 19h15
  2. [XL-97] Mettre à jour les données d'un graphique Excel incorporé dans une présentation
    Par stroumfette44 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 05/03/2012, 15h47
  3. [AIR] Mettre à jour les données
    Par siriu dans le forum Flex
    Réponses: 2
    Dernier message: 12/10/2011, 14h20
  4. Réponses: 3
    Dernier message: 26/09/2007, 14h34
  5. Mettre à jour les données avec un ADODC
    Par ecarbill dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 25/08/2006, 20h41

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