Question

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 modifie ma copie locale, la laissant sur le serveur de test uniquement).

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 la base de données du serveur de test précédent soit correct, car le test commence à entrer les données de test, cela peut devenir un peu délicat.
La même chose se répètera 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:

Était-ce utile?

La solution

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 . générer des scripts SQL, puis exécuter diff sur les scripts SQL fonctionne plutôt bien.

En ignorant 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

Autres conseils

Toad for MySQL dispose de fonctionnalités de comparaison des données et des schémas. même créer un script de synchronisation. Mieux encore, c'est un logiciel gratuit.

J'utilise un logiciel appelé Navicat pour:

  • Synchronisez les bases de données Live avec mes bases de test.
  • Affiche 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.

Un SQLyog (commercial), un outil de synchronisation de schéma, génère un code SQL pour la synchronisation de deux bases de données.

entrer la description de l'image ici

D'après la liste de comparaison des fonctionnalités ... MySQL Workbench offre Schema Diff et Schema Synchronization dans leur édition communautaire.

Il existe certes de nombreuses manières, 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

Vos commentaires sont les bienvenus :)

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

Cela fonctionne avec Oracle, Microsoft SQL Server, Sybase, DB2, Solid, PostgreSQL, H2 et MySQL alt text

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 tentera 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 à une ingénierie inverse 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 des modifications apportées au 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 vos données resteront en sécurité. Et au moment où vous autoriserez les utilisateurs finaux à accéder à votre site, allez-vous réellement modifier constamment la base de données?

vérifiez: 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

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

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

Il existe un outil utile écrit à l'aide de perl appelé Maatkit . Il dispose entre autres de plusieurs outils de comparaison et de synchronisation de bases de données.

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

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

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.

Une recherche Google simple a permis d'utiliser les outils suivants:

Consultez 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 Comparaison de données pour MySQL

Après des heures passées à chercher sur le Web un outil simple, j’ai réalisé que je n’avais pas cherché dans Ubuntu Software Center. Voici une solution gratuite que j'ai trouvée: http://torasql.com/ Ils prétendent aussi avoir une version pour Windows, mais je ne l’utilise que sous Ubuntu.

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

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.

eZ Components - DatabaseSchema vous permet de:

   .Create/Save a database schema definition;
   .Compare database schemas;
   .Generate synchronization queries;

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

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

Avantages:

  • rapide
  • facile à utiliser
  • sélection facile des modifications à appliquer

Inconvénients:

  • ne synchronise pas la longueur sur de petites ints
  • ne synchronise pas correctement les noms d'index
  • ne synchronise pas les commentaires

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

Pour la première partie de la question, je fais juste un vidage des deux et les diff. 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.

Je travaille avec l'équipe marketing de Nob Hill, je voulais vous dire que je serais heureux 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 de ce type 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 convaincus que cela pourrait vous permettre 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 pourrons pas résoudre le problème dans cinq jours ouvrables - vous obtiendrez votre propre copie gratuite!

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top