web-dev-qa-db-fra.com

Comparer deux bases de données MySQL

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

La structure de la base de données est toujours en mutation et change tout au long du développement (je change de copie locale, laissant celle-ci uniquement sur le serveur de test).

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

Bien qu'actuellement, abandonner simplement la base de données du serveur de test précédent est correct, car le test commence à entrer les données de test, cela peut devenir un peu délicat.
La même chose 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 la modifier?


Outils mentionnés dans les réponses:

368
Vincent Ramdhanie

Si vous travaillez avec de petites bases de données, j'ai constaté 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 plutôt bien.

En omettant les commentaires, vous évitez des différences insignifiantes telles que le temps d'exécution de la commande mysqldump. En utilisant la commande --skip-extended-insert, vous vous assurez que chaque ligne est insérée avec sa propre instruction insert. Cela élimine la situation dans laquelle un seul enregistrement nouveau ou modifié peut provoquer une réaction en chaîne dans toutes les instructions d'insertion futures. Courir avec ces options produit des dumps plus volumineux sans commentaires, donc ce n’est probablement pas quelque chose que vous voulez faire en production, mais pour le développement cela devrait aller. 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
210
Jared

Toad for MySQL possède 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. Le meilleur de tous, c'est un logiciel gratuit.

99
Anson Smith

J'utilise un logiciel appelé Navicat pour:

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

Cela coûte de l’argent, c’est Windows et Mac seulement, et il a une interface utilisateur géniale, mais j’aime bien.

20
seanyboy

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

enter image description here

17
Yury Litvinov

À partir de la liste de comparaison des fonctionnalités ... MySQL Workbench offre Schema Diff et Schema Synchronization dans leur édition communautaire.

13
andyhky

Il y a certainement beaucoup de façons, mais dans mon cas, je préfère les commandes 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 :)

13
develCuy

dbSolo, c'est payant, mais cette fonctionnalité pourrait ê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 alt text

12
jmpeace

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 évitant ainsi de perdre des données.

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

Il va tenter de générer des requêtes SQL pour synchroniser deux bases de données, mais je n’y fais pas confiance (ni aucun outil, en fait). Autant que je sache, il n'existe aucun moyen fiable à 100% de procéder à un reverse engineering des 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 ne modifiez que le type d'une colonne, un outil automatisé peut facilement deviner comment le recréer. Mais si vous déplacez également la colonne, renommez-la et ajoutez ou supprimez d'autres colonnes, le meilleur logiciel qu'un logiciel puisse faire est de deviner ce qui s'est probablement passé. Et vous risquez de perdre des données.

Je suggérerais de garder 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 actif (ou de les transférer 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 autoriserez les utilisateurs finaux à accéder à votre site, allez-vous réellement modifier en permanence la base de données?

11
Zac
7
anders.norgaard

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

6
likeuclinux

Il existe un autre outil open source mysql-diff en ligne de commande:

http://bitbucket.org/stepancheg/mysql-diff/

4
stepancheg

Comparaison SQL par RedGate http://www.red-gate.com/products/SQL_Compare/index.htm

DBDeploy pour aider à la gestion des modifications de base de données de manière automatisée http://dbdeploy.com/

3
George

Pour ma part, je commencerais par vider les deux bases de données et les dumps, mais si vous souhaitez générer automatiquement des scripts de fusion, vous souhaiterez obtenir un véritable outil.

Un simple recherche Google a mis en place les outils suivants:

3
Craig Trader

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

dbForge Data Compare for MySQL

3
Devart

Après des heures passées à chercher un outil simple sur le Web, je me suis rendu compte 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 une version pour Windows également, 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/

3
Nikolay Ivanov

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

3
Jarod Elliott

La bibliothèque de composants Apache zeta est une bibliothèque à usage général de composants à couplage faible 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; 
 .Compare des schémas de base de données; 
 .Générez des requêtes de synchronisation; 

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

2
Naim Zard

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

Avantages:

  • vite
  • facile à utiliser
  • facile à sélectionner les changements à appliquer

Désavantages:

  • ne synchronise pas la longueur sur de minuscules ints
  • ne synchronise pas correctement les noms d'index
  • ne synchronise pas les commentaires
2
Artem Goutsoul

Je pense que Navicat for MySQL sera utile dans ce cas. Il supporte la synchronisation des données et des structures pour MySQL. enter image description here

1
Jason Yau

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

À l'origine, nous avions décidé de créer notre outil à partir de rien car, s'il existe d'autres produits similaires sur le marché, aucun d'entre eux ne fonctionne correctement. Il est assez facile de vous montrer les différences entre les bases de données. C’est une toute autre chose de créer une base de données comme une autre. Une migration en douceur, tant du schéma que des données, a toujours été un défi. Eh bien, nous y sommes parvenus.
Nous sommes tellement confiants que cela pourrait vous fournir une migration en douceur, que si elle ne le faisait pas - si les scripts de migration qu'il génère ne sont pas assez lisibles ou ne fonctionneront pas pour vous, et nous ne pouvons pas le réparer. dans cinq jours ouvrables - vous recevrez votre propre exemplaire gratuit!

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

0
Itamar

Pour la première partie de la question, je viens de faire un dump des deux et de les différencier. Pas sûr de mysql, mais postgres pg_dump a une commande pour vider le schéma sans le contenu de la table, vous pouvez ainsi voir si vous avez modifié le schéma.

0
Paul Tomblin