Comparez deux bases de données MySQL [fermé]

368

Je développe actuellement une application utilisant une base de données MySQL.

La structure de la base de données est toujours en évolution et change pendant le développement (je change ma copie locale, en laissant celle sur le serveur de test seule).

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

Bien qu'actuellement, la simple suppression de la base de données du serveur de test soit correcte, alors que les tests commencent à entrer des données de test, cela pourrait devenir un peu délicat.
La même chose, bien que plus, se reproduira plus tard dans la production ...

Existe-t-il un moyen simple d'apporter des modifications incrémentielles à la base de données de production, de préférence en créant automatiquement un script pour le modifier?


Outils mentionnés dans les réponses:

Vincent Ramdhanie
la source
4
Je pense que les outils de RedGate sont réservés à SQL Server.
Dave R.
4
Red Gate a également une version MySQL, actuellement gratuite car elle est en accès anticipé étendu: red-gate.com/products/MySQL_Compare/index.htm
David Atkinson
2
C'est un vrai problème. Je déploie de dev à machine de production et ça casse TOUJOURS quelque chose. Merci pour ce message informatif
Herr
1
L'outil MySQL de Redgate coûte maintenant 70 $ / utilisateur. Même à ce prix, je vais évaluer et publier des commentaires ici.
Jeremy McGee
J'avais également besoin de cela tout à l'heure, j'ai dû augmenter la taille d'un champ. Je ne voulais pas simplement l'augmenter et soupçonner que tout allait bien. @Jared a suggéré exactement ce que j'ai utilisé.
Tass

Réponses:

210

Si vous travaillez avec de petites bases de données, j'ai trouvé l'exécution de mysqldump sur les deux bases de données avec les options --skip-commentset --skip-extended-insertpour générer des scripts SQL, alors l'exécution de diff sur les scripts SQL fonctionne plutôt bien.

En sautant les commentaires, vous évitez les différences inutiles telles que l'heure à laquelle vous avez exécuté la commande mysqldump. En utilisant la --skip-extended-insertcommande, 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 instructions d'insertion futures. L'exécution de ces options produit des vidages plus volumineux sans commentaires, donc ce n'est probablement pas quelque chose que vous souhaitez faire en production, mais pour le développement, cela devrait être bien. 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
Jared
la source
12
Double vote positif pour l'alphabétisation en ligne de commande !!!
dogenpunk
5
Pour comparer les données , utilisez-le à la place; encore des commentaires MySQL4 + sur les jeux de caractères, etc.mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
zanlok
41
-d, --no-datapeut intéresser ceux qui ont besoin d'une utilisation en production mais ne se soucient que du schéma
Louis
7
Un meilleur outil à utiliser serait l' utilitaire mysqldbcompare développé par MySQL lui-même que vous pouvez utiliser sur Windows, Linux ou Mac - il peut également générer des instructions SQL pour les données ET les modifications de schéma et effectue beaucoup plus de tests qu'une simple ligne de commande diff. déterminer.
Jasdeep Khalsa
4
Pour un joli diff avec des couleurs essayezvimdiff
gitaarik
99

Toad pour MySQL a des fonctionnalités de comparaison de données et de schémas, et je pense qu'il va même créer un script de synchronisation. Mieux encore, c'est un logiciel gratuit.

Anson Smith
la source
2
Tous les outils mentionnés semblent bons. Je sélectionne Toad arbitrairement pour l'instant jusqu'à ce que je puisse mener d'autres recherches.
Vincent Ramdhanie
64
J'ai été très enthousiasmé par cet outil jusqu'à ce que je réalise qu'il fonctionne sous Windows, pas sous Linux. Retour à la recherche ...
jdias
2
A fonctionné fantastique pour moi. J'ai fait tout ce dont j'avais besoin et les cellules en surbrillance pour les enregistrements modifiés ont permis de voir facilement ce qui avait changé.
Thames
4
mysqldbcompare avec des --run-all-tests --difftype sql --disable-binary-loggingoptions peut faire presque le même travail (sauf que la sortie est mélangée avec des commentaires et que les caractères spéciaux dans la chaîne ne sont pas échappés).
schemacs
4
@Anson Smith Pouvez-vous me dire l'alternative pour Linux?
Visruth
20

J'utilise un logiciel appelé Navicat pour:

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

Cela coûte de l'argent, c'est Windows et Mac uniquement, et il a une interface utilisateur dingue, mais j'aime ça.

seanyboy
la source
Il fonctionne sous Linux. Je l'ai ouvert sur un autre bureau pour le moment. La fonction de synchronisation de la structure pour pousser les changements de schéma de dev-> test-> live vaut à elle seule les frais de licence.
Colonel Sponsz
2
Belle prise, je ne savais même pas qu'il avait ces caractéristiques. C'est la meilleure chose sur Mac jusqu'à présent.
Hendra Uzia
Il semble ne comparer que les bases de données qui vivent sur les serveurs, pas les fichiers SQL natifs
AlxVallejo
@seanyboy, Pourquoi aimez-vous l'interface utilisateur dingue?
Pacerier
17

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

entrez la description de l'image ici

Yury Litvinov
la source
1
oui, c'est la meilleure solution à ce jour pour moi, fournit de fines requêtes de synchronisation SQL afin que vous puissiez le mettre à jour à tout moment, n'importe où ..
Anupam
trop coûteux et lourd, pas bon pour les
patchs après coup
1
Très lent, et pour une raison quelconque, il supprime et recrée beaucoup de clés étrangères même lorsqu'il n'est pas nécessaire. Pas moyen de suivre les progrès.
Artem Goutsoul
13

De la liste de comparaison des fonctionnalités ... MySQL Workbench propose Schema Diff et Schema Synchronization dans leur édition communautaire.

andyhky
la source
7
Fonctionne très bien! Et c'est gratuit, merci. Pour ceux qui ne l'ont pas trouvé (comme moi). C'est ici: Base de données -> Reverse engineering -> Dans le modèle MySQL ou le diagramme EER -> Base de données -> Synchroniser avec n'importe quelle source
bentzy
Cela fonctionne bien. Cependant, vous ne pouvez comparer que les bases de données du même nom. J'ai plusieurs bases de données (client multi-locataire) que je souhaite synchroniser à partir d'une version "maître" sur le même hôte. Je dois donc renommer le maître pour qu'il corresponde à la base de données de chaque client avant la synchronisation. Sinon sympa!
scipilot
Des informations supplémentaires à ce sujet peuvent être trouvées sur ce lien
Steven Ryssaert
13

Il y a certainement plusieurs façons, mais dans mon cas, je préfère la commande dump et diff. Voici donc un script basé sur le commentaire de Jared:

#!/bin/sh

echo "Usage: dbdiff [user1:pass1@dbname1] [user2:pass2@dbname2] [ignore_table1:ignore_table2...]"

dump () {
  up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
  mysqldump --opt --compact --skip-extended-insert -u $user -p$pass $dbname $table > $2
}

rm -f /tmp/db.diff

# Compare
up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
for table in `mysql -u $user -p$pass $dbname -N -e "show tables" --batch`; do
  if [ "`echo $3 | grep $table`" = "" ]; then
    echo "Comparing '$table'..."
    dump $1 /tmp/file1.sql
    dump $2 /tmp/file2.sql
    diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
  else
    echo "Ignored '$table'..."
  fi
done
less /tmp/db.diff
rm -f /tmp/file1.sql /tmp/file2.sql

Les commentaires sont les bienvenus :)

develCuy
la source
12

dbSolo, c'est payant mais cette fonctionnalité est peut-être celle que vous recherchez http://www.dbsolo.com/help/compare.html

Il fonctionne avec Oracle, Microsoft SQL Server, Sybase, DB2, Solid, PostgreSQL, H2 et MySQL texte alternatif

jmpeace
la source
c'était exactement ce que je cherchais! Impressionnant!
Josh Nankin
11

Si vous avez seulement besoin de comparer des schémas (pas de données) et d'avoir accès à Perl, mysqldiff peut fonctionner. Je l'ai utilisé car il vous permet de comparer des bases de données locales à des bases de données distantes (via SSH), vous n'avez donc pas besoin de vous soucier de vider des données.

http://adamspiers.org/computing/mysqldiff/

Il tentera de générer des requêtes SQL pour synchroniser deux bases de données, mais je ne lui fais pas confiance (ni aucun outil, en fait). Pour autant que je sache, il n'existe aucun moyen fiable à 100% de rétroconcevoir les modifications nécessaires pour convertir un schéma de base de données en un autre, en particulier lorsque plusieurs modifications ont été apportées.

Par exemple, si vous modifiez uniquement le type d'une colonne, un outil automatisé peut facilement deviner comment recréer cela. Mais si vous déplacez également la colonne, la renommez et ajoutez ou supprimez d'autres colonnes, le mieux que tout progiciel puisse faire est de deviner ce qui s'est probablement passé. Et vous risquez de perdre des données.

Je suggère de garder une trace de toutes les modifications de schéma que vous apportez au serveur de développement, puis d'exécuter ces instructions à la main sur le serveur en direct (ou de les rouler dans un script de mise à niveau ou une migration). C'est plus fastidieux, mais cela gardera vos données en sécurité. Et au moment où vous commencez à autoriser les utilisateurs finaux à accéder à votre site, allez-vous vraiment apporter des modifications lourdes constantes à la base de données?

Zac
la source
N'oubliez pas de fournir les deux --hostNet --userNcela échouera en silence.
Znarkus
J'ai eu du mal avec les outils mysqldbcompare d'Oracle générant des bogues sur les index et modifiant des champs équivalents. L'outil mysqldiff a fonctionné parfaitement et a permis de gagner un bon moment.
Robert K
6

vérifier: http://schemasync.org/ l'outil schemasync fonctionne pour moi, c'est un outil en ligne de commande qui fonctionne facilement en ligne de commande linux

likeuclinux
la source
1
Si vous rencontrez des problèmes pour installer ceci sur un mac, je n'ai pu le faire qu'en installant mysql et python en utilisant homebrew, avec macports en vain.
Bijou Trouvaille
3

Il existe un outil utile écrit en utilisant Perl appelé Maatkit . Il dispose de plusieurs outils de comparaison et de synchronisation de bases de données, entre autres.

Jarod Elliott
la source
Je ne connaissais pas ce projet! Merci, on dirait qu'il a pas mal d'outils qui seraient extrêmement utiles.
Vincent Ramdhanie
2
Je n'ai pas trouvé d'outils de comparaison de schémas dans Maatkit.
stepancheg
Moi non plus - où dans les outils pourrions-nous trouver cela?
Shabbyrobe
Je ne pense pas qu'il y ait de comparaison de schéma là-dedans. Je faisais référence à la comparaison et à la synchronisation des données en utilisant mk-table-checksum et mk-table-sync
Jarod Elliott
c'est sur le processus code.google.com/p/maatkit/wiki/mk_schema_sync
droope
3

Pour moi, je commencerais par vider les deux bases de données et différencier les vidages, mais si vous voulez des scripts de fusion générés automatiquement, vous allez vouloir obtenir un véritable outil.

Une simple recherche Google a révélé les outils suivants:

Craig Trader
la source
3

Jetez un œil à dbForge Data Compare pour MySQL . C'est un shareware avec une période d'essai gratuite de 30 jours. Il s'agit d'un outil graphique MySQL rapide pour la comparaison et la synchronisation des données, la gestion des différences de données et la synchronisation personnalisable.

Comparaison des données dbForge pour MySQL

Devart
la source
3

Après des heures de recherche sur le Web pour un outil simple, j'ai réalisé que je ne cherchais pas dans Ubuntu Software Center. Voici une solution gratuite que j'ai trouvée: http://torasql.com/ Ils prétendent avoir également une version pour Windows, mais je ne l'utilise que sous Ubuntu.

Edit: 2015-Feb-05 Si vous avez besoin d'un outil Windows, TOAD est parfait et gratuit: http://software.dell.com/products/toad-for-mysql/

Nikolay Ivanov
la source
2
Le développement de cet outil s'est arrêté et est maintenant inclus dans Percona: percona.com/software/percona-toolkit
mrmuggles
2

La bibliothèque de composants apache zeta est une bibliothèque à usage général de composants à couplage lâche pour le développement d'applications basées sur PHP 5.

Composants eZ - DatabaseSchema vous permet de:

   .Créez / enregistrez une définition de schéma de base de données;
   .Comparer les schémas de base de données;
   Générer des requêtes de synchronisation;

Vous pouvez consulter le didacticiel ici: http://incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema/tutorial.html

Naim Zard
la source
2

Outil de comparaison et de synchronisation très simple à utiliser:
Database Comparer http://www.clevercomponents.com/products/dbcomparer/index.asp

Avantages:

  • vite
  • facile à utiliser
  • modifications faciles à sélectionner à appliquer

Désavantages:

  • ne synchronise pas la longueur aux minuscules pouces
  • ne synchronise pas correctement les noms d'index
  • ne synchronise pas les commentaires
Artem Goutsoul
la source
Certes, ils ont fait une mise à jour superficielle avec quelques petits changements en 5 ans. Mais il n'est pas activement développé.
Artem Goutsoul
1

Je pense que Navicat pour MySQL sera utile dans ce cas. Il prend en charge la synchronisation des données et des structures pour MySQL. entrez la description de l'image ici


la source
0

Pour la première partie de la question, je fais juste un cliché des deux et je les diffère. Je ne suis pas sûr de mysql, mais postgres pg_dump a une commande pour simplement vider le schéma sans le contenu de la table, donc vous pouvez voir si vous avez modifié le schéma.

Paul Tomblin
la source
MySQL a une commande similaire mysql_dump. Cela pourrait être une solution si je pouvais l'intégrer dans un processus de déploiement. Merci.
Vincent Ramdhanie
De plus, pour une expérience plus conviviale, vous pouvez obtenir la même chose en utilisant phpMyAdmin - un vrai tueur pour les utilisateurs de MySQL!
schonarth
Des schémas identiques peuvent facilement entraîner différents vidages de schéma. Différentes versions du client mysql peuvent produire des vidages légèrement différents (un problème si vous comparez des schémas de deux machines différentes), et des choses comme les clés étrangères et les contraintes peuvent être vidées dans un ordre différent.
Mark E. Haase du
0

Je travaille avec l'équipe marketing de Nob Hill, je voulais vous dire que je serai heureux d'entendre vos questions, suggestions ou autre chose, n'hésitez pas à me contacter.

À l'origine, nous avons décidé de créer notre outil à partir de zéro, car bien qu'il existe d'autres produits de ce type sur le marché, aucun d'entre eux ne fait le travail correctement. Il est assez facile de vous montrer les différences entre les bases de données. C'est une tout autre chose de créer une base de données comme l'autre. La migration en douceur, à la fois du schéma et des données, a toujours été un défi. Eh bien, nous l'avons atteint ici.
Nous sommes tellement convaincus qu'il pourrait vous fournir une migration en douceur, que si ce n'était pas le cas - si les scripts de migration qu'il génère ne sont pas suffisamment lisibles ou ne fonctionnent pas pour vous, et nous ne pouvons pas le corriger en cinq jours ouvrables - vous obtiendrez votre propre exemplaire gratuit!

http://www.nobhillsoft.com/NHDBCompare.aspx


la source
est-ce une promesse? Je l'ai essayé et il est tombé avec quelques erreurs, notamment lors de la migration d'une fonction, il tente d'utiliser le même propriétaire que la base de données d'origine
Cruachan
Oui c'est une promesse. Pour la plupart des gens, l'outil fonctionne très bien. Nous promettons une licence à vie pour tout bug que vous trouverez et nous ne pouvons pas le résoudre dans les 5 jours ouvrables. Veuillez contacter notre équipe d'assistance.