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é :confused: 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 rempli. Lorsque le serveur primaire est réparé, il aura une différence de données avec le secondaire :confused: 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 stop 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 :confused:

Merci pour vos idées

Si tu nous disais de quel BDD il s’agit ça irais mieux déjà :unamused:

Après pour le principe général il est tout a fait possible de faire ce que tu demande.
Pour la comparaison de base il te faut un DBLink entre les deux, une requête du style :

Select * from table_source as ts where ts.clée not exist (select clée from table_cible as tc using dblink)

Ensuite si tu veux faire de la mise a niveau automatiquement du PL/SQL devrais le faire.

Mais pour ce genre de problématique je te conseil le forum de Devoloppez.net ou tu trouveras des membres très pointu sur ce genre de cas d’école.

Merci pour ta réponse.

Mes BDD sont diverses, BDD centreon, nagios, cacti, otrs…
Mais le fait le connaitre ce que je veux synchro ne changera rien je pense.

Mais tes idées m’intéresse, je vais regardé du coté developpez.net alors merci :wink:

DBlink est un soft ?
Qu’est ce que PL/SQL ?

Merci

[quote=“flyght”]Bonjour,
J’aimerais savoir s’il est possible de comparer deux BDD MySQL avec une certaine commande SQL, perso je n’ai pas trouvé :confused:
[/quote]
=> par une jointure, tu peux facilement récupérer les données de la base B qui sont manquantes dans la base A.
Exemple pour comparer 2 champs identiques (fruit) des 2 tables (arbre) des 2 bases de données (A et B):

mysql -uroot -pTon_mot_de_passe -e "select B.arbre.fruit from B.arbre.fruit, A.arbre.fruit where B.arbre.fruit!=A.arbre.fruit"

Pour tous les champs :

mysql -uroot -pTon_mot_de_passe -e "select B.arbre.* from B.arbre.*, A.arbre.* where B.arbre.*!=A.arbre.*"

=>Une fois que tu as les données manquantes de la base B, tu les insère dans la base A avec la requête insert classique.

Ah oui pas mal, je vais essayer ça en effet.

S’il y a d’autres idées je prends aussi :slightly_smiling:

Si je ne dis pas de bêtise, ça ne fait pas le job.
La requête fait le produit cartésien puis garde tous les couples pour lesquels les deux éléments du couple sont différents.
Si par exemple on a 1, 2 et 3 dans B et 1 et 2 dans A. Le produit cartésien donne (1,1) (1,2) (2,1) (2,2) (3,1) (3,2)
Et donc après application de la clause where il reste (1,2) (2,1) (3,1) (3,2)
Soit en résultat de la requête 1, 2, 3 et 3.

Il faudrait plutôt utiliser une clause “NOT IN”.

En aparté, je trouve tout de même dangereux de procéder à des manipulations sur une base en production.

Si tu as un besoin de posséder une base de secours à jour la mise en place d’un Heartbeat avec une réplication et une surveillance sur la VIP serait à mon sens un gage de sureté, après en cas de bascule il n’est pas recommandé d’effectuer des opérations avec base en route de toute façon pour effectuer soit un nettoyage des ‘duplicate entries’ ou un ‘dump’ complet pour restauration et ce genre d’opération peut-être effectué à une heure favorable.

[quote=“flyght”]DBlink est un soft ?
Qu’est ce que PL/SQL ?[/quote]
Dans le monde Oracle DBLink est un lien/pipe qui permet de faire une requete inter-base/instance. Après il est possible d’en faire inter BDD si je ne me trompe pas.

Le PL/SQL est un langage de programmation spécifique a Oracle, mais PostgreSQL, DB2 ou les autres ont l’équivalent.

Merci pour vos réponses.

Donc si j’ai bien saisi le script [quote]mysql -uroot -pTon_mot_de_passe -e “select B.arbre.fruit from B.arbre.fruit, A.arbre.fruit where B.arbre.fruit!=A.arbre.fruit”[/quote] ne fonctionne pas ?

[quote]Dans le monde Oracle DBLink est un lien/pipe qui permet de faire une requete inter-base/instance. Après il est possible d’en faire inter BDD si je ne me trompe pas.
Le PL/SQL est un langage de programmation spécifique a Oracle, mais PostgreSQL, DB2 ou les autres ont l’équivalent.[/quote]
Ah ok merci, mais ducou je ne vais pas changer ma BDD pour du PostgreSQL, impossible.

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

Bon quand je parlais de BDD je sous-entendais le logiciel, pas les données. Donc tu es sur du 100% MySQL.
Sinon le 1er lien de ton ami google “mysqldump a chaud”:
wiki.pedrono.fr/index.php/MYSQL_ … 3%A0_chaud

Donc oui il est tout a fait possible de faire ce que tu demandes :unamused:

A titre d’exemple pour faire exactement la même chose avec Oracle qui n’est quand même pas le dernier au niveau des possibilités … On a été obligé d’acheter une licence pour un soft excellent qui s’appelle PL/SQL Developer (autour de 800€ la licence) alors si tu peux te passer de ce genre d’outils pour MySQL sans développer des procédures de malade, je te souhaite de passer de bonnes nuits :slightly_smiling:

Bonjour,

Pour mon site http://www.xxxxxxxxxxxxxxxxxxxxxxx.net, je suis confronté un peu au même problème et j’aurais voulu savoir s’il était possible d’utiliser la méthode énoncée à savoir faire quelque chose qui serait dans le genre :

Select * from table_source as ts where ts.clée not exist (select clée from table_cible as tc using dblink)

En fait, j’aurais voulu comparer les données insérées par les clients avec les données que nous insérons de notre côté. Pensez-vous qu’il est viable de faire un CronTab sur une requête telle que celle-ci pour comparer régulièrement les informations ou existe t-il une autre méthode?

En vous remerciant par avance

Edit de LOL: Lien commercial cassé.

Bonjour,

Merci pour ton lien, en effet je n’ai jamais inscrit exactement “mysqldump à chaud” dans google c’était plutôt du genre “sauvegarde BDD mysql à chaud” et je n’ai rien trouvé de tel.

Je vais essayer cette commande, maintenant le risque surement c’est de faire la sauvegarde à chaud et que des données soient écrites en même temps que la sauvegarde :confused: mais bon on ne peut pas tout avoir, c’est soit on lock soit on lock pas les tables ^^’

Je vais bien voir :slightly_smiling:

Helas l’entreprise n’aura pas les fonds pour ce genre d’outil :/, c’est une TPE et la sauvegarde est loin d’être une priorité.

Merci pour votre aide

J’ai déjà utilisé ce soft, et il est vrai qu’il est particulièrement bien foutu pour faire du PL/SQL. Mais pour des besoins ponctuel ou pas de trop haut niveau SQL Developper est largement suffisant, ce soft est fait par et pour Oracle.
Après pour MySQL il y a un équivalent (dev.mysql.com/doc/refman/5.0/fr/ … yntax.html) et SQL Developper peut être bidouiller pour accepter une connexion MySQL.
Sinon il doit bien exister des solutions en logiciel libre autour de ça.

En fait le mysqlhotcopy lock tout de même les tables, la sauvegarde est beaucoup plus rapide mais ne fait pas du tout la même chose qu’un dump.
Cela me créé toutes les sauvegardes de table en .frm illisibles.

Tempis :s