Lukas: 2 mysql db auf Struktur hin vergleichen

Hallo,

ich such jetzt schon seit 2 Std. im Netz nach einem guten (wenn möglich) kostenfreien Tool, um 2 Datenbanken miteinander zu vergleichen.- Es geht mir niur um die Struktur.

Am Ende soll ein Script generiert werden, daß die Ziel-DB der Quell-DB angleicht.

Toad for mySQL habe ich installiert, beim "compare" schmiert es mir ab. Zudem finde ich es mit 70MB für meine Anforderung etwas "oversized"...

Kennt jemand ein schlankes Tool für mein Problem?

Lukas

  1. Am Ende soll ein Script generiert werden, daß die Ziel-DB der Quell-DB angleicht.

    Wie soll das aussehen?
    Woher soll ein Tool wissen welches die gemeinten Tabellen sind. Oder heißen die in beiden Systemen gleich?
    Wenn ja sollen dann nur fehlende Tabellenfelder ergänzt werden?

    Oder anders ausgedrückt. Du schnappst dir einfach die Struktur, installierst die DB neu (natürlich leer) und lädst dann die Daten rein. Wenn du jetzt sagst das funktioniert nicht, kann ich mir nicht vorstellen wie dir ein Tool dann dabei helfen soll, da das Tool garantiert nicht weiß welches Feld von DB A zu DB B passt.
    Also entweder funktioniert das mit dem Struktur kopieren oder du musst da manuell ran.

    Gruß
    ausgeschlafener
    T-Rex

    1. Wie soll das aussehen?
      Woher soll ein Tool wissen welches die gemeinten Tabellen sind. Oder heißen die in beiden Systemen gleich?

      Moin,

      z.b.

      http://www.youtube.com/watch?v=NKnR8Psu3_8

      http://docs.oracle.com/cd/E17952_01/workbench-en/mysqldiff.html

      Lukas

      1. http://www.youtube.com/watch?v=NKnR8Psu3_8

        WOW :D also nein... rofl.
        Sowas könnte selbst ich programmieren.

        Also ein Beispiel. Da gibts DB mit ganz vielen Tabellen. Wir gucken einfach mal auf eine Tabelle nennen wir sie "Tabelle". Diese hat sagen wir mal 5 Felder. Die heißen Feld1, Feld2 etc...
        Jetzt kopierst du die komplette DB. Da der Tabellenname und die Felder nicht gerade aussagekräftig sind benennt man beides um. Jetzt heißt die Tabelle "Zauberei" und die Felder "Abrakadabra1"-5. Da man noch 2 Felder hinzufügt gibt es jetzt 7 Felder.
        Woher soll eine Software wissen das die zwei Tabellen zusammengehören? Anhand der Feldnamen? Geht schlecht. Anhand der Inhalte? Gibt wiederum tausend Beispiele die Gegen den Inhalt sprechen. Und so weiter...

        Und das Video zeigt wunderbar, dass man sowas nicht mergen kann.

        Gruß
        Fass un(d)(gs) Loser
        T-Rex

        1. Jetzt kopierst du die komplette DB. Da der Tabellenname und die Felder nicht gerade aussagekräftig sind benennt man beides um. Jetzt heißt die Tabelle "Zauberei" und die Felder "Abrakadabra1"-5.

          Du bist auch ein Zauberer ;)
          Mal im Ernst, hast Du überhaupt ne Ahnung, wozu diese Art von Feature zuständig ist?
          Es geht darum, Entwicklungssysteme mit Produktivsystemen abzugleichen.
          Und da ist man in Entwicklungssystemen oft eine ganze Ecke weiter als in den Livesystemen. Auch mal in die verkehrte Richtung, zugegeben.
          Am Ende wird alles gut, nur kann man nicht mehr 100% sicher sein, ob die Live-DB exact der Entwicklungs-DB entspricht.
          Und dann kommen diese Art Programmfeatures ins Spiel. Die läßt sinnvollerweise kein Mensch automatisiert durchlaufen. Aber man läßt sich die Unterschiede der DBs heraussuchen.

          Könnte man auch selber programmieren, muß man aber nicht.

          Lukas

          1. Mal im Ernst, hast Du überhaupt ne Ahnung, wozu diese Art von Feature zuständig ist?
            Es geht darum, Entwicklungssysteme mit Produktivsystemen abzugleichen.

            Okay darauf wäre ich echt nicht gekommen.
            Seit meinem letzten Arbeitgeber benutzten ich Updatescripte. Die bestehen aus einer Datei mit MySQL Befehlen und einer Versionsnummer und einem Script, das sich um das Einspielen und Versionsnummer hochzählen kümmert.
            Die Update Datei sieht so aus:

            /*---|:| 124 |:|---*/
            ALTER TABLE MAIL ADD MAIL_TRIGGER_IP VARCHAR(23) NOT NULL DEFAULT "";

            /*---|:| 125 |:|---*/
            ALTER TABLE RECALL MODIFY RECALL_DESCRIPTION VARCHAR(1024) NOT NULL DEFAULT "";

            Das Updatescript sucht nach der letzten Versionsnummer (Deshalb auch die etwas umständliche schreibweise mit |:|), sagen wir mal 123. Dann zählt es eins drauf, also 124 und führt den SQL Befehl aus. In diesem Fall wird die Tabelle Mail erweitert. Dann speichert es in der Datenbank (kann aber auch eine Datei sein) die neue Versionsnummer. Das ganze geht dann rekursiv weiter bis die Datei zu Ende ist oder ein Fehler bei einem SQL Befehl aufgetreten ist.

            Der Vorteil:

            • Es gibt keinen Abgleich mehr. Man lässt einfach das Updatescript ausführen und ist auf dem neusten Stand. Das läuft natürlich vollautomatisch.
            • Anstelle von Datenbank Erweiterungen kann man auch Änderungen des Datenbestandes eintragen z.B. Geschlecht von "mannlich", "weiblich" auf "m", "w" umstellen.
            • Man könnte das Script auch erweitern, dass PHP Befehle ausgeführt werden - z.B. das Dumpen von Daten.
            • Bei der Versionsnummer könnte man noch das Datum dazu schreiben, dann hat man eine Perfekte Log-Datei mit der man beweisen kann wann was hinzukam. Dass kann bei späteren Problemen helfen.

            Gibt aber noch einen kleinen Nachteil. Wenn die SQL Systeme nicht kompatibel sind, kann es sein dass man SQL Befehle verfasst die im Testsystem funktionieren aber im Produktivumfeld nicht mehr. Das Problem trat bei mir mit Views und Indexfeldern auf.

            Mein Updatescript besteht aktuell aus 2-3 PHP Dateien. Die sind auf mein System angepasst. Wenn du ganz lieb frägst, baue ich es so um dass man es global benutzten kann, schreibe noch eine kleine Doku dazu und stelle es selfhtml als Download zu Verfügung.

            Gruß
            Upgrade
            T-Rex

            1. Moin,

              Okay darauf wäre ich echt nicht gekommen.

              Nicht schlimm, deshalb reden wir ja drüber.

              /*---|:| 124 |:|---*/
              ALTER TABLE MAIL ADD MAIL_TRIGGER_IP VARCHAR(23) NOT NULL DEFAULT "";

              /*---|:| 125 |:|---*/
              ALTER TABLE RECALL MODIFY RECALL_DESCRIPTION VARCHAR(1024) NOT NULL DEFAULT "";

              Das ist im Prinzip nicht so viel anders, als das, was ich haben will. Woher nimmt denn Dein Script die Querys? Fügst Du die selber manuell ein oder zieht sich das Script die irgendwo her?

              Das Updatescript sucht nach der letzten Versionsnummer (Deshalb auch die etwas umständliche schreibweise mit |:|), sagen wir mal 123. Dann zählt es eins drauf, also 124 und führt den SQL Befehl aus. In diesem Fall wird die Tabelle Mail erweitert. Dann speichert es in der Datenbank (kann aber auch eine Datei sein) die neue Versionsnummer. Das ganze geht dann rekursiv weiter bis die Datei zu Ende ist

              Gute Sache..

              oder ein Fehler bei einem SQL Befehl aufgetreten ist.

              Horror ;)
              Kenn ich aber von meinen Sachen auch.

              Der Vorteil:

              ...

              Gibt aber noch einen kleinen Nachteil.

              ...

              Mein Updatescript besteht aktuell aus 2-3 PHP Dateien. Die sind auf mein System angepasst. Wenn du ganz lieb frägst, baue ich es so um dass man es global benutzten kann, schreibe noch eine kleine Doku dazu und stelle es selfhtml als Download zu Verfügung.

              Ganz lieb fragen ist jetzt viel weniger mein Problem als nicht genau zu wissen, wie Dein Script arbeitet oder was genau es macht. Woher nimmt es die Daten, die es zu ändern gilt? Ist Dein Script so ne Art Repository?

              Interessieren tuts mich schon und ich lerne auch gerne dazu.

              <ganz lieb> Ich finde Deine Idee gut, kannst Du es der Self-Gemeinde zur Verfügung stellen?</ganz lieb>

              Gruß, Lúkas

              1. Die Querys schreibst du selber hinein. Einfache Querys wie das hinzufügen/ändern einer Spalte ist copy&paste + ein wenig anpassen. Auch neue Tabellen erstelle ich so sehr einfach. Bei komplexeren Abfragen die nur einmal ablaufen dürfen teste ich das ganze vorher lokal mit phpmyadmin. Wenn der Query passt wird er einfach in die Datei kopiert.
                Wichtig ist das ein Query nur einmal ablaufen darf. Unser Prakitkant hatte mal einen Query reingeschrieben der so aufgebaut war, dass er jedes mal ablaufen würde und die Daten komplett ändert. So nach dem Motto kopiere alle Daten und häng sie hinten an. Lässt man das Script dann 4 mal ablaufen hat man aus 2 Datensätze 4,8,16,32 Datensätze gemacht. Solche seltenen einmaligen Updates führe ich dann manuell durch. Die sind aber wirklich sehr selten - also für mich.

                Klar mache ich gerne. Dafür muss ich das Script noch ein wenig umschreiben (und vor allem mal in eine Klasse packen).

                Gruß
                Script umschreibender
                T-Rex

              2. Om nah hoo pez nyeetz, Lukas!

                <ganz lieb> Ich finde Deine Idee gut, kannst Du es der Self-Gemeinde zur Verfügung stellen?</ganz lieb>

                +1

                Matthias

                --
                Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Diele und Dielektrizitätskonstante.

                1. Sooooo. Da mein Updatescript zum einen aus historischen Gründen echt mies programmiert ist und zum anderen zu sehr mit meiner eigenen Lib verwachsen ist, habe ich mir tatsächlich die Mühe gemacht und habe die Grundzüge nochmal neu Programmiert - nur für euch!

                  Es wäre eine super Sache wenn ihr mich als Gegenleistung beim testen meiner Kochseite unterstützen könntet.

                  Hier kann man sich das Zip runterladen:
                  http://www.weust.de/download/updatescript.zip

                  Achja... mit phpdoc habe ich nicht all zu viel am Hut. Habe trotzdem versucht die Syntax zu wahren und das ganze so gut ich kann zu beschreiben. Man möge es mir etwas nachsehen wenn die Sachen nicht optimal sind.

                  Gruß
                  Script Bastler
                  T-Rex

                  1. Da wäre noch was.
                    Das Script lasse ich ca. 1 Monat online. Danach nehme ich mir das Recht es zu löschen. Wenn ihr das Script als gut empfindet, könnte man es auf den selfhtml Server verschieben.!?;,_-

                    Gruß
                    Nachschiebender
                    T-Rex

  2. ich such jetzt schon seit 2 Std. im Netz nach einem guten (wenn möglich) kostenfreien Tool, um 2 Datenbanken miteinander zu vergleichen.- Es geht mir niur um die Struktur.

    Am Ende soll ein Script generiert werden, daß die Ziel-DB der Quell-DB angleicht.

    versuch mal mysqldiff: https://metacpan.org/release/MySQL-Diff

    ist ein perl-tool. generiert dir statements, um eine db der anderen anzugleichen.

    das hier gibts auch noch, hat glaube ich mit obigem nichts zu tun: http://www.mysqldiff.org/

    1. Hi tinita,

      versuch mal mysqldiff: https://metacpan.org/release/MySQL-Diff

      ist ein perl-tool. generiert dir statements, um eine db der anderen anzugleichen.

      Ok, das versuch ich mal.

      das hier gibts auch noch, hat glaube ich mit obigem nichts zu tun: http://www.mysqldiff.org/

      Das nutze ich schon seit Jahren. Funktioniert tadellos, einzig die Vorarbeit, es zu nutzen, ist vergleichsweise hoch.

      Danke erstmal, Lukas

      1. Ach ja, ausserdem gibts noch SQL::Translator.
        Ist auch ein perl-Tool, auf debian/ubuntu unter libsql-translator-perl zu finden.
        Enthalten ist ein Skript sqlt-diff. Man übergibt 2 Schema-Dateien mit ihrem Typ, also z.B. MySQL; es kann ausser MySQL noch eine Reihe anderer DBS: https://metacpan.org/release/SQL-Translator