368 votes

Comparer deux bases de données MySQL

Je dispose d'une base de données MySQL que je suis en train de développer. J'ai une copie de cette base de données sur ma machine de développement que je modifie aussi vite que je développe et une copie sur un serveur de test. Ma question est la suivante :

Existe-t-il un moyen de comparer les deux instances de la base de données pour voir s'il y a eu des changements ?

Ce n'est pas un réel problème de simplement redéployer la base de données sur le serveur de test, mais lorsque les utilisateurs finaux commencent à entrer des données de test, cela peut être un peu délicat. Une question connexe est également pertinente un peu plus tard dans la production...

Existe-t-il un moyen simple d'apporter des modifications incrémentielles à la base de données de production ? En d'autres termes, si j'ajoute une nouvelle table et modifie une table existante, existe-t-il des outils qui détectent les changements et génèrent des scripts qui effectuent les mises à jour en toute sécurité sur la copie de production de la base de données ?

EDIT : Outils mentionnés dans les réponses :

4 votes

Je crois que les outils de RedGate sont pour SQL Server seulement.

4 votes

Red Gate dispose également d'une version MySQL, actuellement gratuite car elle est en accès anticipé étendu : red-gate.com/produits/MySQL_Compare/index.htm

2 votes

Il s'agit d'un véritable problème. Je déploie de la machine de développement à la machine de production et cela casse TOUJOURS quelque chose. Merci pour cet article informatif

210voto

Jared Points 23711

Si vous travaillez avec de petites bases de données, j'ai trouvé qu'exécuter mysqldump sur les deux bases de données avec les options --skip-comments et --skip-extended-insert pour générer des scripts SQL, puis exécuter diff sur les scripts SQL fonctionne assez bien. En ignorant les commentaires, vous évitez les différences insignifiantes telles que l'heure à laquelle vous avez exécuté la commande mysqldump. En utilisant la commande --skip-extended-insert, vous vous assurez que chaque ligne est insérée avec sa propre instruction d'insertion. Cela élimine la situation où un seul enregistrement nouveau ou modifié peut provoquer une réaction en chaîne dans toutes les déclarations d'insertion futures. L'exécution avec ces options produit des vidages plus volumineux sans commentaires. Ce n'est donc probablement pas quelque chose que vous souhaitez faire en production, mais pour le développement, cela devrait être suffisant. J'ai mis des exemples des commandes que j'utilise ci-dessous.

mysqldump --skip-comments --skip-extended-insert -u root -p dbName1>file1.sql
mysqldump --skip-comments --skip-extended-insert -u root -p dbName2>file2.sql
diff file1.sql file2.sql

12 votes

Double plus de votes pour la connaissance de la ligne de commande !!!

1 votes

Ligne de commande ftw ! maintenant je peux l'utiliser dans n'importe quel script :)

5 votes

Pour comparer données utilisez plutôt ceci ; il y a encore des commentaires de MySQL4+ sur les jeux de caractères, etc. mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql

98voto

Anson Smith Points 2905

Toad pour MySQL a des fonctionnalités de comparaison de données et de schémas, et je crois qu'il créera même une synchronisation script. Le meilleur de tous, c'est qu'il est freeware.

2 votes

Tous les outils mentionnés semblent bons. Je choisis Toad arbitrairement pour l'instant, jusqu'à ce que je puisse effectuer des recherches plus approfondies.

0 votes

MySQL Workbench fournit juste un rapport des changements, ne génère pas la mise à jour script (ou je n'ai pas trouvé comment le faire) si vous comparez deux scripts. Il vous demande alors de mettre à jour la base de données. Dans mon cas, je suis seulement intéressé par la mise à jour du script.

0 votes

Toad est très peu pratique :( vous ne pouvez pas simplement comparer deux dumps SQL différents.

20voto

seanyboy Points 3170

J'utilise un logiciel appelé Navicat à :

  • Synchroniser les bases de données Live avec mes bases de données de test.
  • Montrez les différences entre les deux bases de données.

Il coûte de l'argent, il est réservé à Windows et Mac, et il a une interface bizarre, mais je l'aime bien.

0 votes

Il fonctionne sous Linux. Je l'ai ouvert sur un autre bureau en ce moment. La fonction de synchronisation de la structure pour pousser les changements de schéma de dev->test->live vaut à elle seule le prix de la licence.

2 votes

Bien vu, je ne savais même pas qu'il avait ces caractéristiques. C'est la meilleure chose sur le Mac jusqu'à présent.

0 votes

Il semble qu'il ne compare que les bases de données qui se trouvent sur les serveurs, et non les fichiers sql natifs.

17voto

Yury Litvinov Points 613

Il existe un outil de synchronisation des schémas dans la section SQLyog (commercial) qui génère du SQL pour synchroniser deux bases de données.

enter image description here

1 votes

Oui, c'est la meilleure solution jusqu'à présent pour moi, elle fournit des requêtes de synchronisation SQL fines afin que vous puissiez la mettre à jour à tout moment, n'importe où

0 votes

Trop coûteux et lourd, pas bon pour les rafistolages après coup

1 votes

Très lent, et pour une raison quelconque, il supprime et recrée un grand nombre de clés étrangères même lorsque cela n'est pas nécessaire. Aucun moyen de suivre la progression.

13voto

andyhky Points 600

De la liste de comparaison des caractéristiques... Banc d'essai MySQL propose Schema Diff et Schema Synchronization dans leur édition communautaire.

7 votes

Ça marche bien ! Et c'est gratuit, merci. Pour ceux qui ne l'ont pas trouvé (comme moi). C'est ici : Base de données -> Rétroingénierie -> Dans le modèle MySQL ou le diagramme EER -> Base de données -> Synchroniser avec n'importe quelle source

0 votes

Cela fonctionne bien. Cependant, vous ne pouvez comparer que des bases de données portant le même nom. J'ai plusieurs bases de données (client multi-tenant) que je veux synchroniser à partir d'une version "maître" sur le même hôte. Je dois donc renommer la version maître pour qu'elle corresponde à chaque base de données client avant la synchronisation. Sinon, c'est très bien !

0 votes

Vous trouverez des informations supplémentaires à ce sujet sur le site suivant lien

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X