2009-01-19 3 views
12

Je cherchais un script portable ou un programme de ligne de commande qui peut synchroniser deux schémas de bases de données MySQL. Je ne recherche pas de solution basée sur une interface graphique, car elle ne peut pas être automatisée ou exécutée avec l'outil de création/déploiement.Synchroniser le schéma de deux bases de données dans MySQL

Fondamentalement ce qu'il devrait faire est scan database1 et database2. Vérifiez la différence de schéma (tables et index) et proposez un ensemble d'instructions SQL à exécuter sur l'une de sorte que la structure similaire de l'autre soit minimisée autant que possible.

Si quelqu'un peut indiquer un paquet PHP, Python ou Ruby où ce type de solution est implémenté, je peux essayer de copier le code à partir de là.

Beaucoup d'outils GUI MySQL peuvent probablement le faire, mais je suis à la recherche d'une solution scriptable. Edit: Désolé de ne pas être plus clair: Ce que je cherche, c'est la synchronisation dans la structure de la table tout en gardant les données intactes autant que possible. Pas de réplication de données.

Plus d'infos:

Pourquoi la réplication ne fonctionnera pas.

  1. Les bases d'installation sont réparties autour de l'état.
  2. Nous souhaitons que le programme d'installation effectue des correctifs dynamiques sur la base de données en fonction des chagnes créés dans la dernière version, quelle que soit l'ancienne version de l'utilisateur final. Les modifications consistent essentiellement à ajouter une nouvelle colonne à une table, à créer de nouveaux index ou à supprimer des index, à ajouter des tables ou à supprimer des tables utilisées par le système en interne (nous ne supprimons pas la table de données utilisateur).

S'il s'agit d'une interface graphique: Non, elle ne peut pas être utilisée. Nous ne voulons pas regrouper une application de 20 Mo avec notre installateur juste pour diff. Spécialement lorsque le programme d'installation d'origine est inférieur à 1 Mo.

+0

+1 Excellente question. J'allais le demander parce que je suis à la recherche de la même solution ... mais je l'ai trouvé. –

Répondre

5

Avez-vous envisagé d'utiliser MySQL replication?

+0

Je soupçonne que le PO cherche quelque chose d'aussi simple que possible pour reproduire le schéma. Je suppose que la réplication MySql pourrait le faire, mais ce n'est pas vraiment simple à configurer. – Nathan

+0

La réplication est beaucoup plus facile à mettre en place (si vous en avez les droits) que d'écrire ce qui serait un outil de comparaison SQL. – Willem

+0

Il semble que cela nécessite également la duplication de données, par '... parce que les données sont répliquées sur l'esclave ...'. L'exemple PHP fourni nécessite également une fonction DROP DATABASE, qui est hors de portée pour la question. –

1

Pour une solution professionnelle à long terme, vous devriez garder un œil sur Schemamatic (http://versabanq.com/products/schemamatic.php). Ce lien montre une application graphique mais tout ce qu'il fait est de manipuler un logiciel de ligne de commande. Dans cette page il y a un lien vers son site de code google où la version C# .Net de Schemamatic peut être trouvée. Votre solution parfaite serait d'ajouter un support pour MySQL à Schemamatic. Pour SQL Server, c'est parfait et fait exactement ce que vous avez mentionné.

Maintenant, pour une solution à court terme, je suggère le dumping les données que vous voulez avec les outils de ligne de commande de MySQL comme: mysqldump -A -c -uroot -Pmot_de_passe> bkpmysql.sql

Et jouer avec , bien que cela prenne un peu de temps pour réaliser ce que vous voulez. Schemamatic me semble vraiment votre meilleur choix. Faites-moi savoir si vous avez besoin de clarification quand/si vous essayez Schemamatic.

1

Vous souhaiterez peut-être consulter certains outils tels que dbdeploy (version java ou .net) et liquidbase et others.

Bien que je pense que la plupart d'entre eux vont appliquer des ensembles de changements à une base de données d'une manière contrôlée. Je ne sais pas s'ils peuvent faire de l'ingénierie inverse à partir des schémas existants et comparer.

E.

4

SQLyog fait cela et c'est génial. Nous l'utilisons souvent en production.

+0

Je suis d'accord, excellent outil. Cependant, cela ne fonctionne pas sur la plupart de mes serveurs Web en raison du blocage des ports. –

+0

@Talvi Watia, Ils fournissent un proxy PHP pour de tels cas. –

1

Je sais qu'il est une vieille question, mais il a été le premier résultat sur Google pour ce que je cherchais (exactement la même chose que la question initiale)

J'ai trouvé la réponse encore ici, mais je ne me souviens pas URL c'est un script qui a commencé à partir de:

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 

et a fini plus comme celui-ci

#!/bin/sh 

echo "Usage: dbdiff [user1:[email protected]] [user2:[email protected]] [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