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


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

La structure de la base de données est en constante évolution et évolue au fur et à mesure du développement (je change ma copie locale, 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 ya des modifications?

Bien que l'abandon de la base de données du serveur de test précédente soit satisfaisant, la mise à l'essai des données de test risque d'être un peu compliquée.
Le même si plus se produira encore plus tard dans la production ...

Existe-t-il un moyen facile de modifier de manière incrémentielle 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:


368
2017-10-22 13:41


origine


Réponses:


Si vous travaillez avec de petites bases de données, j'ai trouvé l'exécution de mysqldump sur les deux bases de --skip-comments et --skip-extended-insert options 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 sans signification telles que l'heure à laquelle vous avez exécuté la commande mysqldump. En utilisant le --skip-extended-insert commande vous assurez que chaque ligne est insérée avec sa propre instruction d'insertion. 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. Exécuter avec ces options produit des vidages plus importants sans aucun commentaire, donc ce n'est probablement pas quelque chose que vous voulez faire en production, mais pour le développement ça 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
2018-01-03 21:03



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


99
2017-10-22 13:48



J'utilise un logiciel appelé Navicat à :

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

Ça coûte de l'argent, ce sont des fenêtres et des macs seulement, et ça a une interface bizarre, mais j'aime ça.


20
2017-10-22 13:52



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

enter image description here


17
2018-04-01 16:32



À partir de la liste de comparaison des caractéristiques ... MySQL Workbench propose la synchronisation de schéma et la synchronisation de schéma dans leur édition communautaire.


13
2017-10-22 13:50



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 :)


13
2018-04-23 18:02



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
2017-10-04 22:17



Si vous avez seulement besoin de comparer des schémas (et non des données) et d'avoir accès à Perl, mysqldiff pourrait 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 à vous soucier du vidage de 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 (ou n'importe quel outil, en fait). Pour autant que je sache, il n'y a pas de moyen fiable à 100% pour effectuer l'ingénierie inverse des modifications nécessaires pour convertir un schéma de base de données en un autre, surtout 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, la renommez et ajoutez ou supprimez d'autres colonnes, le meilleur logiciel que vous pouvez 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 des modifications de schéma que vous apportez au serveur de développement, puis d'exécuter ces instructions à la main sur le serveur live (ou de les transférer dans un script de mise à niveau ou une migration). C'est plus fastidieux, mais vos données resteront en sécurité. Et au moment où vous commencerez à autoriser les utilisateurs finaux à accéder à votre site, allez-vous vraiment faire des changements de base de données lourds constants?


11
2017-10-22 14:29