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:
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
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.
J'utilise un logiciel appelé Navicat pour:
Cela coûte de l’argent, c’est Windows et Mac seulement, et il a une interface utilisateur géniale, mais j’aime bien.
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.
À partir de la liste de comparaison des fonctionnalités ... MySQL Workbench offre Schema Diff et Schema Synchronization dans leur édition communautaire.
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 :)
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
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?
Regardez http://www.liquibase.org/
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
Il existe un autre outil open source mysql-diff en ligne de commande:
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/
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:
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.
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/
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.
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
Outil de comparaison et de synchronisation très facile à utiliser:
Database Comparer http://www.clevercomponents.com/products/dbcomparer/index.asp
Avantages:
Désavantages:
Je pense que Navicat for MySQL sera utile dans ce cas. Il supporte la synchronisation des données et des structures pour MySQL.
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!
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.