368 Stimmen

Zwei MySQL-Datenbanken vergleichen

Ich entwickle derzeit eine Anwendung, die eine MySQL-Datenbank verwendet.

Die Datenbankstruktur ist noch im Fluss und ändert sich im Laufe der Entwicklung (ich ändere meine lokale Kopie und lasse diejenige auf dem Testserver in Ruhe).

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

Während es derzeit noch ausreicht, die vorherige Testserver-Datenbank einfach zu löschen, könnte es bei der Eingabe von Testdaten ein wenig schwierig werden.
Das Gleiche, wenn auch in größerem Umfang, wird später in der Produktion wieder passieren...

Gibt es eine einfache Möglichkeit, schrittweise Änderungen an der Produktionsdatenbank vorzunehmen, vorzugsweise durch die automatische Erstellung eines Skripts zur Änderung der Datenbank?


In den Antworten erwähnte Tools:

210voto

Jared Punkte 38791

Wenn Sie mit kleinen Datenbanken arbeiten, habe ich festgestellt, dass die Ausführung von mysqldump auf beiden Datenbanken mit der --skip-comments y --skip-extended-insert um SQL-Skripte zu erzeugen, und dann funktioniert die Ausführung von diff auf die SQL-Skripte recht gut.

Durch das Überspringen von Kommentaren vermeiden Sie bedeutungslose Unterschiede wie die Zeit, zu der Sie den Befehl mysqldump ausgeführt haben. Indem Sie die --skip-extended-insert Befehl stellen Sie sicher, dass jede Zeile mit einer eigenen Einfügeanweisung eingefügt wird. Dadurch wird verhindert, dass ein einziger neuer oder geänderter Datensatz eine Kettenreaktion in allen zukünftigen Einfügeanweisungen auslösen kann. Die Ausführung mit diesen Optionen führt zu größeren Dumps ohne Kommentare, so dass Sie dies wahrscheinlich nicht in der Produktion verwenden sollten, aber für die Entwicklung sollte es in Ordnung sein. Ich habe unten Beispiele für die von mir verwendeten Befehle aufgeführt:

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

98voto

Anson Smith Punkte 6076

Toad für MySQL verfügt über Daten- und Schemavergleichsfunktionen und kann sogar ein Synchronisierungsskript erstellen. Das Beste von allem ist, dass es Freeware ist.

20voto

seanyboy Punkte 5563

Ich verwende eine Software namens Navicat zu:

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

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

17voto

Yury Litvinov Punkte 1324

Es gibt ein Schema-Synchronisierungswerkzeug in SQLyog (kommerziell), das SQL für die Synchronisierung zweier Datenbanken erzeugt.

enter image description here

13voto

develCuy Punkte 520

Es gibt sicherlich viele Möglichkeiten, aber in meinem Fall bevorzuge ich den Befehl dump und diff. Hier ist also 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 :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X