Daten nach MySQL migrieren
Anders als beim reinen Datenimport gibt es bei der Migration bzw. Übernahme von Altdaten in eine neue MySQL Datenbank meistens das Problem, dass die Schlüsselspalten (Primary Key) nicht mit übertragen werden können bzw. neue Primary Keys vergeben werden und die Beziehungen zwischen den einzelnen Tabellen wieder hergestellt werden müssen. Mit diesem Beispiel möchten wir erläutern welche Möglichkeiten der FlowHeater dazu bietet. Es werden einige Fallbespiele aufgelistet, die Komplexität geht dabei von einfach bis sehr komplex.
Bitte beachten Sie die Informationen zu den verwendeten Beispielen am Ende des Artikels.
Migration der alten Auto ID (Auto Inkrement) Werte
MySQL Datenbank migriert werden sollen müssen Sie dazu lediglich pro zu migrierende Tabelle eine Import Definition anlegen und jede Tabelle einmalig in die neu MySQL Datenbank importieren.
Das einzige Problem sind die Auto ID Werte. MySQL bietet von Haus aus die Möglichkeit Feldern mit dem Attribut „Auto Inkrement“ einen Wert beim Import zuzuweisen, die Werte müssen lediglich eindeutig sein. Die MySQL Datenbank stellt automatisch den nächsten zu vergebenden Auto Wert auf den maximal importierten Wert (+1) ein. So ist sichergestellt, dass bei einem normalen Insert der Auto Inkrement Wert keine doppelten Werte liefert.
Um das im FlowHeater zuzulassen müssen Sie im MySQL Adapter auf der WRITE Seite unter „Felder / Datentypen“ das Auto Inkrement Feld markieren und die Option „Auto Inkrement“ deaktivieren. So behandelt der FlowHeater das Feld wie jedes andere auch und importiert diese Werte mit in die MySQL Datenbank.
Migration von Master/Detail (1:n) Beziehungen - Einfach
Auto Inkrement“ bietet der FlowHeater eine sehr mächtige Funktion um das relativ einfach umzusetzen.
Hierzu legen Sie sich eine neue Definition an und wählen auf der READ Seite den Adapter/Datenquelle von der Sie die Daten migrieren möchten. Bei Datenbank Adapter können Sie im SQL auf der READ Seite JOINS verwenden um z.B. Rechnungen mit deren Rechnungspositionen zu exportieren.
select * from RECHNUNGEN as R inner join POSITIONEN as P on R.RechNr = P.RechNr order by R.RechNr
Auf der WRITE Seite wählen Sie den MySQL Adapter aus. Bei der Neuanlage von FlowHeater Definitionen können Sie lediglich einen Adapter auswählen. Fügen Sie daher über den Designer (s.Screenshot) einen weiteren MySQL Adapter für die Rechnungspositionen hinzu. Jetzt müssen wir die Adapter noch dementsprechend konfigurieren.
MySQL Master Tabelle
Zuerst konfigurieren wir den MySQL Adapter für die Master Tabelle (Rechnungen). Öffnen Sie den Konfigurator und tragen die Verbindungsdaten zur MySQL Datenbank ein. Wichtig ist hier, dass Sie nur „Daten anfügen (Insert)“ sowie „Vorhandene Datensätze ignorieren“ aktivieren. So wird sichergestellt, dass nicht für jede Rechnungsposition, das können ja mehrere sein, ein neuer Datensatz in die Tabelle importiert wird.
Auf dem Reiter „Felder / Datentypen“ wählen Sie hier die Master Tabelle (Rechnungen) aus und lesen die Schemainformationen ein. Schließen Sie den Konfigurator und verbinden Sie nun alle benötigten Felder bis auf das Primary Key (Auto Inkrement) Feld mit dem ersten MySQL Adapter.
MySQL Detail Tabelle
Nun müssen wir noch die MySQL Detail Tabelle konfigurieren. Öffnen Sie den Konfigurator der Detail Tabelle und tragen Sie hier ebenfalls die MySQL Verbindungsdaten ein. Im Detail Adapter muss auf dem Reiter „Allgemein“ lediglich die Option „Daten anfügen (Insert)“ aktiviert werden. Auf dem Reiter „Felder / Datentypen“ wählen Sie die Detail Tabelle Rechnungspositionen aus und lesen dazu die Schemainformationen ein.
Übernahme des aktuellen Auto Inkrement Wertes aus der Master Tabelle
Damit die Daten nach der Migration wieder zusammenpassen müssen wir den pro Rechnung vergebenen neuen Auto Inkrement Wert (Primary Key) irgendwie hier im Fremdschlüsselfeld für die Rechnungsposition eintragen. Das Problem ist, dass dieser Wert vorher ja nicht feststeht und wir dem Feld über den Designer keine Verbindung / Wert zuweisen können.
Um den Wert übernehmen zu können bietet der FlowHeater die Möglichkeit über die FlowHeater Standardwert Eigenschaft den Auto Inkrement Wert der Master Tabelle zu übernehmen. Markieren Sie hierzu das Fremdschlüsselfeld und wählen Sie über die Standardwert Dropdown Box das Feld Rechnungsnummer aus (s. Screenshot). Wenn Sie nun den Konfigurator schließen sehen Sie, dass das Feld Deaktiviert (ausgegraut) ist und über den Designer dem Feld kein Wert zugweisen werden kann. Hierum kümmert sich der FlowHeater während des Datenimports.
Hinweis: Da der Auto Inkrement Wert erst während der Ausführung feststeht wird im Test Modus lediglich der Adaptername gefolgt vom Feldnamen angezeigt!
Achtung: Damit dieses Vorgehen funktioniert müssen die Detaildatensätze auf der READ Seite in sortierter Reichenfolge vorliegen!
Migration von Master/Detail (1:n) Beziehungen – Komplex
In Fällen in denen keine Auto Inkrement Werte verwendet werden können, oder aber die neuen Primary Key / Fremdschlüssel Werte selbst gesetzt werden müssen kann folgendes Vorgehen verwendet werden. Gehen wir bei unserem Beispiel davon aus, dass der Fremdschlüssel für die Kundennummer ebenfalls neu vergeben werden muss.
Umsetzung des Fremdschlüssels über CSV Lookup
Hierzu wird eine einfache CSV Textdatei dazu verwendet den alten „Primary Key“ zusammen mit dem neuen „Primary Key“ für die weitere Migration temporär zwischen zu speichern. Die CSV Lookup Datei wir dabei während der Migration der MySQL Kundentabelle in ein CSV Datei exportiert. Der Aufbau der CSV Lookup Datei ist „AlteID;NeueID“.
Migration der MySQL „Kunden“ Tabelle
Erstellen Sie eine neue FlowHeater Definition und wählen auf der READ Seite wieder Ihre Datenquelle/Adapter aus die Sie für die Migration benötigen. Auf der WRTE Seite wählen Sie den MySQL Adapter und konfigurieren den Adapter für den Import in die Kunden Tabelle. Anschließend fügen Sie der Definition einen weiteren TextFile Adapter auf der WRITE Seite hinzu um während der Migration/Importes die CSV Lookup Datei zu exportieren. Geben Sie als CSV Exportdateiname „kunden-id.csv“ an und fügen sie zwei Felder „AlteID“ und „NeueID“ hinzu. Schließen Sie den Konfigurator und verbinden Sie das alte Primary Key Feld mit dem CSV Feld „AlteID“. Die neue ID Lassen wir uns von einem SQL Heater aus der Datenbank holen. In unserem Fall lassen wir uns lediglich die Maximale ID (select max(id) + 1 ...) der Kundentabelle zurückgeben und addieren darauf den Wert 1 damit diese fortlaufend vergeben werden.
Wenn Sie jetzt die Daten in die MySQL Kunden Tabelle importieren erzeugen bzw. exportieren wir gleichzeitig eine CSV Datei „kunden-ids.csv“ mit der „Alten“ sowie der „Neuen“ ID.
CSV Lookup durchführen
Diese CSV Datei verwenden wir nun um bei der Migration der Rechnungen/Positionen die Kundennummer/ID umzusetzen. Dazu verwenden wir einen String Replace Heater. In den erweiterten Einstellungen kann dieser einen CSV Lookup durchführen. Tragen Sie dazu den Pfad zur oben generierte CSV Datei ein und geben für „Suchen Spalte“ den Wert 1 sowie für „Ersetzen Spalte“ den Wert 2 an. Wird nun dem String Replace Heater als Eingangsparameter die „Alte“ Kundennummer übergeben wird diese in der CSV Datei gesucht und bei einem Treffer wird die zweite Spalte (= neue Kundennummer) zurückgeliefert. So können Primary Key und die dazugehörigen Fremdschlüssel relativ elegant bei der Datenmigration umgesetzt werden.
Hinweis: Alternativ zum CSV Lookup können die Alten/Neuen IDs auch in einer weiteren MySQL Tabelle zwischengespeichert werden. Die neue ID kann dann ebenfalls pro Datensatz mittels des Lookup Heater bzw. des SQL Heater abgerufen werden.
Informationen zum verwendeten Beispiel
Damit das Beispiel nicht zu komplex wurde, wurde das Beispiel auf Basis von drei Tabellen (Kunden, Rechnungen und Positionen) ausgelegt. Das Beispiel soll nur veranschaulichen wie das generelle Vorgehen bei der Datenmigration ist. In der Praxis wird es eher selten vorkommen, dass bei der Datenmigration Rechnungsnummern oder Kundennummern umzusetzen sind. Sowie wurden auf der READ Seite lediglich CSV Dateien als Datenquelle verwendet. Hier können Sie sich die verwendeten Beispiel Definitionen als ZIP Archiv herunterladen. Download MySQL Datenmigrations Beispiel