Vergleichen Sie zwei MySQL-Datenbanken [geschlossen]

368

Ich entwickle derzeit eine Anwendung mit einer MySQL-Datenbank.

Die Datenbankstruktur ist noch im Fluss und ändert sich während der Entwicklung (ich ändere meine lokale Kopie und lasse die auf dem Testserver allein).

Gibt es eine Möglichkeit, die beiden Instanzen der Datenbank zu vergleichen, um festzustellen, ob Änderungen vorgenommen wurden?

Während es derzeit in Ordnung ist, die vorherige Testserver-Datenbank einfach zu verwerfen, kann es etwas schwierig werden, beim Testen Testdaten einzugeben.
Das Gleiche, aber mehr wird später in der Produktion wieder passieren ...

Gibt es eine einfache Möglichkeit, schrittweise Änderungen an der Produktionsdatenbank vorzunehmen, vorzugsweise indem automatisch ein Skript erstellt wird, um diese zu ändern?


In den Antworten erwähnte Tools:

Vincent Ramdhanie
quelle
4
Ich glaube, die Tools von RedGate sind nur für SQL Server.
Dave R.
4
Red Gate hat jetzt auch eine MySQL-Version, die derzeit kostenlos ist, da sie einen erweiterten frühen Zugriff bietet
David Atkinson
2
Es ist ein echtes Problem. Ich stelle von Entwickler auf Produktionsmaschine bereit und es bricht IMMER etwas. Vielen Dank für diesen informativen Beitrag
Herr
1
Das MySQL-Tool von Redgate kostet jetzt 70 US-Dollar pro Benutzer. Auch zu diesem Preis werde ich hier bewerten und Kommentare posten.
Jeremy McGee
Auch brauchte dies gerade jetzt, musste die Größe eines Feldes erhöhen. Ich wollte es nicht einfach erhöhen und vermuten, dass alles in Ordnung war. @ Jared schlug genau das vor, was ich verwendet habe.
Tass

Antworten:

210

Wenn Sie mit kleinen Datenbanken arbeiten, bei denen ich festgestellt habe, dass mysqldump in beiden Datenbanken mit den Optionen --skip-commentsund --skip-extended-insertzum Generieren von SQL-Skripten ausgeführt wird, funktioniert die Ausführung von diff in den SQL-Skripten recht gut.

Durch das Überspringen von Kommentaren vermeiden Sie bedeutungslose Unterschiede wie die Zeit, zu der Sie den Befehl mysqldump ausgeführt haben. Mit dem --skip-extended-insertBefehl stellen Sie sicher, dass jede Zeile mit einer eigenen Einfügeanweisung eingefügt wird. Dadurch wird die Situation beseitigt, in der ein einzelner neuer oder geänderter Datensatz in allen zukünftigen Einfügeanweisungen eine Kettenreaktion auslösen kann. Wenn Sie mit diesen Optionen arbeiten, werden größere Speicherauszüge ohne Kommentare erstellt. Dies ist wahrscheinlich nicht das, was Sie in der Produktion verwenden möchten, aber für die Entwicklung sollte es in Ordnung sein. Ich habe Beispiele für die Befehle angegeben, die ich unten verwende:

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
Jared
quelle
12
Doppelte Plus-Stimmen für die Befehlszeilenkompetenz !!!
Dogenpunk
5
Verwenden Sie stattdessen diese Option, um Daten zu vergleichen . noch einige MySQL4 + Kommentare zu Zeichensätzen usw.mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
Zanlok
41
-d, --no-datakann für diejenigen von Interesse sein, die Produktionszwecke benötigen, sich aber nur um das Schema kümmern
Louis
7
Ein besseres Werkzeug wäre das von MySQL selbst entwickelte Dienstprogramm mysqldbcompare , das Sie unter Windows, Linux oder Mac verwenden können. Es kann auch SQL-Anweisungen für Daten- UND Schemaänderungen ausgeben und führt viel mehr Tests durch, als ein einfacher Befehlszeilendifferenz könnte bestimmen.
Jasdeep Khalsa
4
Für einen schönen Unterschied mit Farben versuchen Sievimdiff
gitaarik
99

Toad for MySQL verfügt über Funktionen zum Vergleichen von Daten und Schemas, und ich glaube, es wird sogar ein Synchronisationsskript erstellt. Das Beste ist, es ist Freeware.

Anson Smith
quelle
2
Alle genannten Tools sehen gut aus. Ich wähle Toad vorerst willkürlich aus, bis ich weitere Nachforschungen anstellen kann.
Vincent Ramdhanie
64
Ich war total begeistert von diesem Tool, bis mir klar wurde, dass es unter Windows und nicht unter Linux läuft. Zurück zur Suche ...
jdias
2
Hat fantastisch für mich funktioniert. Ich habe alles getan, was ich brauchte, und die hervorgehobenen Zellen für geänderte Datensätze machten es einfach zu sehen, was sich geändert hat.
Themse
4
mysqldbcompare with --run-all-tests --difftype sql --disable-binary-loggingoptions kann fast den gleichen Job ausführen (außer dass die Ausgabe mit Kommentaren gemischt wird und Sonderzeichen in Zeichenfolgen nicht maskiert werden).
Schema
4
@Anson Smith Kannst du mir die Alternative für Linux sagen?
Visruth
20

Ich benutze eine Software namens Navicat, um:

  • Synchronisieren Sie Live-Datenbanken mit meinen Testdatenbanken.
  • Zeigen Sie Unterschiede zwischen den beiden Datenbanken.

Es kostet Geld, es ist nur Windows und Mac und es hat eine verrückte Benutzeroberfläche, aber ich mag es.

Seanyboy
quelle
Es läuft unter Linux. Ich habe es im Moment auf einem anderen Desktop geöffnet. Die Struktur-Synchronisierungsfunktion zum Übertragen von Schemaänderungen von dev-> test-> live ist allein die Lizenzgebühr wert.
Oberst Sponsz
2
Netter Fang, ich wusste nicht einmal, dass es diese Eigenschaften hat. Es ist das Beste, was es bisher auf dem Mac gab.
Hendra Uzia
Es scheint nur Datenbanken zu vergleichen, die auf Servern leben, nicht native SQL-Dateien
AlxVallejo
@ Seanyboy, warum magst du die verrückte Benutzeroberfläche?
Pacerier
17

In SQLyog (kommerziell) gibt es ein Schema-Synchronisierungstool, das SQL zum Synchronisieren von zwei Datenbanken generiert.

Geben Sie hier die Bildbeschreibung ein

Yury Litvinov
quelle
1
Ja, dies ist die bisher beste Lösung für mich. Sie bietet feine SQL-Synchronisierungsabfragen, sodass Sie sie jederzeit und überall aktualisieren können.
Anupam
überteuert
1
Sehr langsam, und aus irgendeinem Grund werden viele Fremdschlüssel gelöscht und neu erstellt, auch wenn sie nicht benötigt werden. Keine Möglichkeit, dem Fortschritt zu folgen.
Artem Goutsoul
13

Aus der Funktionsvergleichsliste ... MySQL Workbench bietet in seiner Community Edition Schema Diff und Schema Synchronization an.

andyhky
quelle
7
Funktioniert super! Und es ist kostenlos, danke. Für diejenigen, die es nicht finden konnten (wie ich). Es ist hier: Datenbank -> Reverse Engineer -> In MySQL-Modell oder EER-Diagramm -> Datenbank -> Mit einer beliebigen Quelle synchronisieren
bentzy
Es funktioniert gut. Sie können jedoch nur gleichnamige Datenbanken vergleichen. Ich habe mehrere (mandantenfähige Client-) Datenbanken, die ich von einer "Master" -Version auf demselben Host synchronisieren möchte. Daher muss ich den Master vor der Synchronisierung umbenennen, damit er mit jeder Client-Datenbank übereinstimmt. Ansonsten schön!
Scipilot
Weitere Informationen hierzu finden Sie unter diesem Link
Steven Ryssaert
13

Es gibt sicherlich viele Möglichkeiten, aber in meinem Fall bevorzuge ich den Befehl dump und diff. Hier ist ein Skript, das auf Jareds Kommentar basiert:

#!/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

Feedback ist willkommen :)

develCuy
quelle
12

dbSolo, es wird bezahlt, aber diese Funktion könnte die sein, nach der Sie suchen http://www.dbsolo.com/help/compare.html

Es funktioniert mit Oracle, Microsoft SQL Server, Sybase, DB2, Solid, PostgreSQL, H2 und MySQL Alt-Text

jmpeace
quelle
Das war genau das, wonach ich gesucht habe! Genial!
Josh Nankin
11

Wenn Sie nur Schemas (keine Daten) vergleichen müssen und Zugriff auf Perl haben, funktioniert mysqldiff möglicherweise. Ich habe es verwendet, weil Sie damit lokale Datenbanken mit entfernten Datenbanken (über SSH) vergleichen können, sodass Sie keine Daten ausgeben müssen.

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

Es wird versucht, SQL-Abfragen zu generieren, um zwei Datenbanken zu synchronisieren, aber ich vertraue ihm (oder einem anderen Tool) nicht. Soweit ich weiß, gibt es keine 100% zuverlässige Möglichkeit, die Änderungen, die zum Konvertieren eines Datenbankschemas in ein anderes erforderlich sind, rückzuentwickeln, insbesondere wenn mehrere Änderungen vorgenommen wurden.

Wenn Sie beispielsweise nur den Spaltentyp ändern, kann ein automatisiertes Tool leicht erraten, wie dies neu erstellt werden kann. Wenn Sie die Spalte jedoch auch verschieben, umbenennen und andere Spalten hinzufügen oder entfernen, kann jedes Softwarepaket nur raten, was wahrscheinlich passiert ist. Und Sie verlieren möglicherweise Daten.

Ich würde vorschlagen, alle Schemaänderungen zu verfolgen, die Sie am Entwicklungsserver vornehmen, und diese Anweisungen dann manuell auf dem Live-Server auszuführen (oder sie in ein Upgrade-Skript oder eine Migration zu rollen). Es ist langwieriger, aber es schützt Ihre Daten. Und wenn Sie Endbenutzern Zugriff auf Ihre Website gewähren, werden Sie dann wirklich ständig umfangreiche Datenbankänderungen vornehmen?

Zac
quelle
Vergessen Sie nicht , beide zu liefern --hostNund , --userNoder es wird stillschweigend scheitern.
Znarkus
Ich hatte Probleme mit den mysqldbcompare-Tools von Oracle, die Fehler in Indizes generierten und äquivalente Felder änderten. Das mysqldiff-Tool hat einwandfrei funktioniert und viel Zeit gespart.
Robert K
6

check: http://schemasync.org/ Das schemasync-Tool funktioniert für mich. Es ist ein Befehlszeilen-Tool, das problemlos in der Linux-Befehlszeile funktioniert

likeuclinux
quelle
1
Wenn Sie Probleme haben, dies auf einem Mac zu installieren, konnte ich MySQL und Python nur mit Homebrew installieren, ohne Macports ohne Erfolg.
Bijou Trouvaille
3

Es gibt ein nützliches Tool, das mit Perl geschrieben wurde und Maatkit heißt . Es verfügt unter anderem über mehrere Tools zum Vergleichen und Synchronisieren von Datenbanken.

Jarod Elliott
quelle
Ich wusste nichts über dieses Projekt! Vielen Dank, es sieht so aus, als hätte es einige Tools, die äußerst nützlich wären.
Vincent Ramdhanie
2
Ich habe in Maatkit keine Schema-Vergleichstools gefunden.
stepancheg
Ich auch nicht - wo in den Werkzeugen könnten wir das finden?
Shabbyrobe
Ich glaube nicht, dass es dort einen Schemavergleich gibt. Ich bezog mich auf Datenvergleich und Synchronisierung mit mk-table-Prüfsumme und mk-table-sync
Jarod Elliott
3

Für mich selbst würde ich damit beginnen, beide Datenbanken zu sichern und die Speicherauszüge zu unterscheiden. Wenn Sie jedoch automatisch generierte Zusammenführungsskripte möchten, benötigen Sie ein echtes Tool.

Eine einfache Google-Suche ergab die folgenden Tools:

Craig Trader
quelle
3

Schauen Sie sich dbForge Data Compare für MySQL an . Es handelt sich um eine Shareware mit einer 30-tägigen kostenlosen Testphase. Es ist ein schnelles MySQL-GUI-Tool für den Datenvergleich und die Synchronisierung, die Verwaltung von Datenunterschieden und die anpassbare Synchronisierung.

dbForge Data Compare für MySQL

Devart
quelle
3

Nachdem ich stundenlang im Web nach einem einfachen Tool gesucht hatte, stellte ich fest, dass ich nicht im Ubuntu Software Center gesucht hatte. Hier ist eine kostenlose Lösung, die ich gefunden habe: http://torasql.com/ Sie behaupten, auch eine Version für Windows zu haben, aber ich benutze sie nur unter Ubuntu.

Bearbeiten: 2015-Feb-05 Wenn Sie ein Windows-Tool benötigen, ist TOAD perfekt und kostenlos: http://software.dell.com/products/toad-for-mysql/

Nikolay Ivanov
quelle
2
Die Entwicklung dieses Tools wurde gestoppt und ist jetzt in Percona enthalten: percona.com/software/percona-toolkit
mrmuggles
2

Die Apache-Zeta-Komponentenbibliothek ist eine Allzweckbibliothek von lose gekoppelten Komponenten für die Entwicklung von Anwendungen, die auf PHP 5 basieren.

Mit eZ Components - DatabaseSchema können Sie:

   Erstellen / Speichern einer Datenbankschemadefinition;
   Vergleichen Sie Datenbankschemata.
   Generieren Sie Synchronisationsabfragen.

Sie können das Tutorial hier überprüfen: http://incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema/tutorial.html

Naim Zard
quelle
2

Sehr einfach zu bedienendes Vergleichs- und Synchronisierungstool:
Database Comparer http://www.clevercomponents.com/products/dbcomparer/index.asp

Vorteile:

  • schnell
  • Einfach zu verwenden
  • einfach auszuwählende Änderungen zum Anwenden

Nachteile:

  • synchronisiert die Länge nicht mit winzigen Ints
  • Synchronisiert Indexnamen nicht richtig
  • Kommentare werden nicht synchronisiert
Artem Goutsoul
quelle
Es stimmt, sie haben ein oberflächliches Update mit ein paar kleinen Änderungen in 5 Jahren vorgenommen. Aber es wird nicht aktiv entwickelt.
Artem Goutsoul
1

Ich denke, Navicat für MySQL wird in diesem Fall hilfreich sein. Es unterstützt die Daten- und Struktursynchronisation für MySQL. Geben Sie hier die Bildbeschreibung ein


quelle
0

Für den ersten Teil der Frage mache ich einfach einen Dump von beiden und differenziere sie. Sie sind sich bei MySQL nicht sicher, aber postgres pg_dump verfügt über einen Befehl zum einfachen Speichern des Schemas ohne Tabelleninhalt, sodass Sie sehen können, ob Sie das Schema geändert haben.

Paul Tomblin
quelle
MySQL hat einen ähnlichen Befehl mysql_dump. Dies könnte eine Lösung sein, wenn ich sie in einen Bereitstellungsprozess integrieren könnte. Vielen Dank.
Vincent Ramdhanie
Für eine benutzerfreundlichere Erfahrung können Sie dasselbe mit phpMyAdmin erhalten - ein echter Killer für MySQL-Benutzer!
schonarth
Identische Schemas können leicht zu unterschiedlichen Schema-Dumps führen. Verschiedene Versionen des MySQL-Clients erzeugen möglicherweise leicht unterschiedliche Speicherauszüge (ein Problem, wenn Sie Schemas von zwei verschiedenen Computern vergleichen), und Dinge wie Fremdschlüssel und Einschränkungen werden möglicherweise in einer anderen Reihenfolge ausgegeben.
Mark E. Haase
0

Ich arbeite mit dem Marketing-Team von Nob Hill zusammen. Ich wollte Ihnen sagen, dass ich mich über Ihre Fragen, Vorschläge oder sonstige Fragen freuen werde. Bitte zögern Sie nicht, mich zu kontaktieren.

Wir haben uns ursprünglich entschlossen, unser Werkzeug von Grund auf neu zu entwickeln, da es zwar andere solche Produkte auf dem Markt gibt, aber keines von ihnen die Arbeit richtig macht. Es ist ziemlich einfach, Ihnen die Unterschiede zwischen Datenbanken zu zeigen. Es ist etwas ganz anderes, eine Datenbank wie die andere zu erstellen. Die reibungslose Migration von Schema und Daten war schon immer eine Herausforderung. Nun, wir haben es hier erreicht.
Wir sind so zuversichtlich, dass es Ihnen eine reibungslose Migration ermöglichen könnte, als wenn dies nicht der Fall wäre - wenn die generierten Migrationsskripte nicht lesbar genug sind oder für Sie nicht funktionieren und wir es nicht in fünf Werktagen beheben können - Sie erhalten Ihr eigenes kostenloses Exemplar!

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


quelle
ist das ein Versprechen? Ich habe es versucht und es ist mit ein paar Fehlern umgefallen, nicht zuletzt, dass bei der Migration einer Funktion versucht wird, denselben Eigentümer wie die ursprüngliche Datenbank zu verwenden
Cruachan
Ja, es ist ein Versprechen. Für die meisten Menschen funktioniert das Tool einwandfrei. Wir versprechen eine lebenslange Lizenz für jeden Fehler, den Sie finden, und wir können ihn nicht innerhalb von 5 Werktagen beheben. Bitte kontaktieren Sie unser Support-Team.