Ankündigung

Einklappen
Keine Ankündigung bisher.

Hilfe: datenbank mappen und kopieren

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Hilfe: datenbank mappen und kopieren

    Hallo liebe Leser/innen,

    ich hätte da mal wieder ein Problem

    Beschreibung:
    Ich habe zwei Datenbanken, nennen wir sie NEU und ALT.
    Die Datenbank NEU besteht nur aus leeren Tabellen und Spalten, ist also jungfräulich, die Datenbank ALT ist gefüllt und entspricht fast vollständig der Struktur der Datenbank NEU.

    Aber...
    Die Datenbank ALT enthält ein paar Tabellen mehr und/oder in Tabellen eine oder mehrere Spalten, die in der Datenbank NEU nicht existieren.

    Aufgabe:
    Ich möchte alle Daten aus Datenbank ALT in die Datenbank NEU kopieren, aber nur die Daten aus den Tabellen resp. Spalten, die auch in der Datenbank NEU vorliegen. Alles, was in NEU nicht vor kommt, soll entsorgt werden.

    Ich habe jetzt schon mit dem MySQL Migration Toolkit rumgedamelt und noch mit ein paar anderen Tools, aber ohne Erfolg.

    ich kann mir nicht vorstellen, das noch nie jemand vor selbigem Problem stand und das es kein Tool dafür gibt... nur wo
    Wäre echt toll, wenn mir da mal wer aus der Patsche helfen könnte...
    DLzG...
    Micha
    727

  • #2
    über wieviele Tablellen reden wir? Normal kriegst Du sowas auch fix über ein paar SQL Befehle hin.
    [COLOR="#F5F5FF"]--[/COLOR]
    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
    [COLOR="#F5F5FF"]
    --[/COLOR]

    Kommentar


    • #3
      ... hmm, so ca. 100 Tabellen mit teilweise über 50 Spalten ...
      DLzG...
      Micha
      727

      Kommentar


      • #4
        Autsch. Ja das ist schon was.
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #5
          ... ebend, nich nackend
          ... sonst hätte ich auch den zu Fuß Weg eingeschlagen, aBär das is mir'n bisschen viel ...
          DLzG...
          Micha
          727

          Kommentar


          • #6
            Wo sind wir den hier? Das sind ~10 Zeilen Code und fertig...

            Kommentar


            • #7
              ... na, wo sind wir denn hier wirklich? Folgen auf Sprüche auch Taten? Denn wenn ich das selber könnte, würde ich nicht fragen; dafür ist dieses Forum doch gemacht, oder nicht?

              BTW: Ich bin zwar'n DAU, aber kein SuperDAU. Die ~10 Zeilen nehme ich Dir nicht ab. Die werden m.E. schon alleine durch das Öffnen beider DB's verballert ...
              DLzG...
              Micha
              727

              Kommentar


              • #8
                Eigentlich geb ich auf sowas keine Antworten mehr, aber hier hat mich doch mein ehrgeiz gepackt...

                PHP-Code:
                $result $db->query("
                    SELECT
                        new_db.TABLE_NAME AS table,    
                        GROUP_CONCAT(new_db.COLUMN_NAME SEPARATOR ',') AS fields
                    FROM
                        information_schema.COLUMNS AS new_db INNER JOIN
                        information_schema.COLUMNS AS old_db ON (new_db.TABLE_NAME = old_db.TABLE_NAME AND new_db.COLUMN_NAME = old_db.COLUMN_NAME)
                    WHERE
                        new_db.TABLE_SCHEMA = 'new_db' AND
                        old_db.TABLE_SCHEMA = 'old_db'
                    GROUP BY
                        new_db.TABLE_NAME
                "
                );

                foreach(
                $result AS $daten) {
                    
                $db->query("
                                INSERT INTO
                                    new_db.
                $daten[table] ($daten[fields])
                                SELECT
                                    
                $daten[fields]
                                FROM
                                    old_db.
                $daten[table]");

                Alte und neue Datenbank müssen auf dem selben Server leigen.

                PS: ich habs mir erspart die Queries in eine Zeile zu quetschen.

                Kommentar


                • #9
                  Laut Aufgabe sind die Tabellen nicht 100% deckungsgleich. Ergo wird man um manuelle Anpassung gar nicht herum kommen. Der obige Code könnte Dir allenfalls die 100 notwendigen Ausgabsqueries erzeugen (mit echo dann).
                  [COLOR="#F5F5FF"]--[/COLOR]
                  [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                  [COLOR="#F5F5FF"]
                  --[/COLOR]

                  Kommentar


                  • #10
                    @erc:
                    ... ok ... schön, das ich Deinen Ergeiz habe wecken können; ich werde ne Weile brauchen, die Nummer zu durchblicken. Aber Dank schon mal dafür...

                    @nikosch:
                    Stimmt. Ich dachte da etwa an so was (aber nicht lachen jetzt)

                    Lese Tabellennamen NEU ein
                    :Schleife
                    Vergleiche Spalten in Tabelle 1(+x) aus ALT mit NEU
                    Kopiere Daten aus Tabelle 1(+x).ALT nach Tabelle 1(+x).NEU wenn Spalte aus Tabelle.ALT auch in Tabelle.NEU existiert
                    Gehe zu SCHLEIFE solange noch Tabellen z6um bearbeiten da sind

                    Ich glaube, so ganz mit SQL geht das nicht und da ist der EInsatz von PHP o.ä. in Verbindung mit SQL notwendig...
                    DLzG...
                    Micha
                    727

                    Kommentar


                    • #11
                      @erc:
                      Vielen Dank erstmal dafür, auch wenn ich wohl einige Zeit brauchen werde, das zu durchblicken.
                      Aber warum wolltest Du sowas nicht mehr machen? Ich dachte immer, ein Forum wie dieses ist dafür da, das die Anfänger von den Profis lernen können, was natürlich bedingt, das die Profis auch mal den Weg ebnen ...

                      @nikosch:
                      Jepp, genau so ist es. Ich glaube, ganz ohne PHP o.ä. in Verbindung mit SQL wird es nicht gehen. Ich dachte da an so was in der folgenden Art (nich lachen jetzt):

                      Code:
                      Lese Tabellennamen aus NEU
                      :TABELLEN
                      Wenn Tabellenname aus NEU auch in ALT existiert, lese Spaltennamen aus NEU
                      :SPALTEN
                      Wenn Spaltenname aus NEU auch in ALT existiert, kopiere Daten aus ALT in NEU
                      Gehe SPALTEN, solange noch welche in Tabelle.NEU sind
                      Gehe TABELLEN, solange noch welche in NEU sind
                      ...fertig...
                      Naja, so in etwa

                      So, nu geh ich aber bubu und lege mit den Ausdruck von oben unters Kopfkissen in der Hoffnung, das was in mein Hirn sickern mag ... um 5 ist die Nacht zu vorbei...
                      DLzG...
                      Micha
                      727

                      Kommentar


                      • #12
                        Naja, erc hat ja schon was vorgelegt.

                        Wenn Du die Tabellennamen nicht auseinander ableiten kannst musst Du als erstes ein Mapping ALT > NEU der Tabellennamen erstellen.
                        Dann für jede dieser Tabellen wie oben jeweils Quell- und Zielspalten ermitteln und die Schnittmenge als INSERT SELECT Angabe ausgeben lassen.
                        [COLOR="#F5F5FF"]--[/COLOR]
                        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                        [COLOR="#F5F5FF"]
                        --[/COLOR]

                        Kommentar


                        • #13
                          Das war doch schon von anfang an klar, dass du PHP auch verwenden musst. Eine derartige Aufgabe würde ich immer mit "Fehlermapping" bzw. "Statusmapping" einsetzten. Das heißt: Erstelle eine Logdatei wo du platzierst, welche Aufgabe dein Script gerade abgeschlossen hat - und natürlich auch: WIE! Dann kannst du direkt sehen wenn ein Fehler aufgetreten ist.

                          Ich nehme auch an, dass du definitiv PHP als "Zwischenspeicher" verwenden solltest - den Check den du bisher mit MySql gemacht hast, würde ich in PHP lösen.
                          true||false - www.trueorfalse.de - Rund um Software Entwicklung

                          Kommentar


                          • #14
                            Zitat von M*I*B Beitrag anzeigen
                            Code:
                            Lese Tabellennamen aus NEU
                            :TABELLEN
                            Wenn Tabellenname aus NEU auch in ALT existiert, lese Spaltennamen aus NEU
                            :SPALTEN
                            Wenn Spaltenname aus NEU auch in ALT existiert, kopiere Daten aus ALT in NEU
                            Gehe SPALTEN, solange noch welche in Tabelle.NEU sind
                            Gehe TABELLEN, solange noch welche in NEU sind
                            ...fertig...
                            Naja, so in etwa
                            Und genau das macht der Code den ich gepostet habe. Es Sucht sich die Schnittmenge der alten DB die auf die Neue passt.
                            Führ doch einfach mal den ersten Query aus... dabei 'old_db' und 'new_db' in der WHERE Klausel entsprechend ersetzen.

                            Kommentar


                            • #15
                              ... wie gesagt, ich brauche ne Weile, um das zu durchblicken. Im Moment brennt es auch ein bischen auf der Arbeit; mal sehen, ob ich da heute noch zu komme. ich melde mich aber auf jeden Fall ...
                              DLzG...
                              Micha
                              727

                              Kommentar

                              Lädt...
                              X