Die Auswahl der verwendeten Datenbanksysteme ist von weitreichender Bedeutung im Hinblick auf Entwicklung und Wartung der verwendeten Applikationen. Kürzlich stellen sich unserer Kunden vermehrt die Frage, ob sie von Oracle nach PostgreSQL migrieren wollen. Die Reduzierung von Lizenzkosten ist dabei ein wichtiger Faktor. Weitere Punkte sollten bei der Entscheidungsfindung aber ebenfalls gebührend berücksichtigt werden, um die Vor- und Nachteile einer Migration abzuwägen. In diesem Blog schildern wir unsere Erfahrung einer Migration von Oracle nach PostgreSQL mit Informatica PowerCenter.
Ausgangslage
Der Kunde hat sich entschieden, einen Oracle-Server ausser Betrieb zu nehmen und die Datenbanken nach PostgreSQL zu migrieren. Die Migration geschieht in mehreren Etappen, um den laufenden Betrieb nicht zu gefährden. Als ETL-Tool kommt Informatica PowerCenter zum Einsatz. Andere Applikationen laufen weiterhin auf Oracle. Somit beinhaltet die Migration auch das Einbinden der neuen PostreSQL Tabellen in die bestehenden Systeme.
Datentypen in Oracle und PostgreSQL
Die alten Oracle-Tabellen enthalten Primär- und Fremdschlüssel im Datentyp RAW. Dieser wird bei der Migration nicht übernommen, sondern in PostgreSQL durch NUMERIC ersetzt. Das heisst, dass die Schlüssel bei der Migration neu generiert werden.
Textfelder vom Typ VARCHAR2(n) werden in PostgreSQL auf den Typ VARCHAR(n) oder TEXT gelegt. Bei TEXT ist dabei neu Länge unlimitiert, vergleichbar zu CLOB in Oracle. Damit bei diesen Fällen die Informatica-Session den Buffer nicht zu gross ansetzt, passen wir die Textlänge in den Informatica-Targets auf die Länge der Sources an.
Oracle kennt keinen boolean Datentyp. Stattdessen werden binäre Daten typischerweise als NUMBER(1, 0) gespeichert. Informatica Powercenter unterstützt ebenfalls keinen boolean Datentyp in Transformationen. Bool- respektive Bit-Columns werden im Source-Qualifier als String importiert. Dennoch kann man in PostgreSQL Bool-Columns schreiben. Wie erwartet, wird dabei 0 auf false
und 1 auf true
gemappt. Interessant ist dabei, dass decimal Datentypen ebenfalls nach bool konvertiert werden können. Wir stellen dabei das folgende Verhalten fest: 0 <= x < 1
wird zu false
und 1 <= x < 2
zu true
. Alle anderen Werte resultieren in einem Fehler.
Bei Datumsfeldern muss man beachten, dass DATE in Oracle die Zeit mit einer Genauigkeit von Sekunden beinhaltet. In PostgreSQL ist DATE jedoch nur das Datum ohne Zeit. Wenn die Zeit mit Sekunden benötigt wird, muss in PostgreSQL TIMESTAMP(0) verwendet werden. Bei höherer Genauigkeit bis Mikrosekunden wird in beiden Systemen TIMESTAMP verwendet.
Oracle | PostgreSQL |
VARCHAR2(n) | VARCHAR(n) |
CLOB | TEXT |
NUMBER(p, s) | NUMERIC(p, s) |
NUMBER(1, 0), nur Werte von 0 und 1 | BOOL |
DATE, nur Datum ohne Zeit | DATE |
DATE, Datum und Zeit | TIMESTAMP(0) |
TIMESTAMP | TIMESTAMP |
Code-Page Verwirrung in Informatica
Die Oracle und PostgreSQL Datenbanken verwenden beide die UTF‑8 Codepage. Informatica ist ebenfalls auf UTF‑8 eingestellt. Trotzdem gab es einige Überraschungen bei der Migration. Wurde der ODBC-Konnektor für PostgreSQL in Informatica auf UTF‑8 eingestellt, wurden alle multibyte Zeichen nicht korrekt verarbeitet, also Zeichen wie «ö» oder «é». Die vermeintliche Lösung war, den Konnektor auf ISO 8859–1 einzustellen. Also war die Codepage des Konnektors anders als die der Quelle- und Zieldatenbanken.
Das führte jedoch zu einem weiteren Problem. Beim Schreiben ins Ziel hat Informatica Texte mit einer Länge von einem Byte pro Zeichen behandelt. Bei Einträgen in der Quelle, wo die Textlänge ganz oder nahezu ausgeschöpft war, wurde der Text vor dem Schreiben ins Ziel gekürzt. Um dieses Verhalten zu verhindern, musste in der Target-Definition die Länge aller Textfelder erhöht werden. Zur Sicherheit haben wir die Länge gegenüber der Definition auf der Tabelle verdoppelt. So könnte auch ein String, der ausschliesslich aus zweibytigen Zeichen besteht korrekt verarbeitet werden.
Durch das Umstellen des Konnektors auf ISO 8859–1 und dem gleichzeitigen Erhöhen der Feldlänge in der Informatica Target-Definition wurde der Grossteil der Texte korrekt verarbeitet. In die umgekehrte Richtung von PostgreSQL nach Oracle waren keine manuellen Anpassungen an der Target-Definition nötig. Beim Lesen ab PostgreSQL und dem Schreiben in Oracle mit dem PostgreSQL Konnektor in ISO 8859–1 wurden Sonderzeichen korrekt verarbeitet.
Nach umfangreichen Tests zeigte sich jedoch, dass dieser Workaround für einige Zeichen nicht funktionierte. Zum Beispiel wurde das französische «œ» (U+0153) als «S» ausgegeben. Nach weiteren Analysen stellte sich heraus, dass das Setting für die ODBC-Konnektoren im odbc.ini File auf ISO_8859‑1:1987 eingestellt war (IANAAppCodePage=4). Die Lösung ist, sowohl den ODBC-Konnektor als auch die Codepage im odbc.ini File auf UTF‑8 einzustellen (IANAAppCodePage=106).
Fremdschlüssel
Aufgrund des Änderns der Schlüsseltypen müssen die Primär- und Fremdschlüssel neu erstellt werden. Um die Fremdschlüsselbeziehungen zu erhalten, werden die alten Schlüssel vom Typ RAW zwischengespeichert und auf die neuen Schlüssel gemappt. Die gewählte Lösung hängt von der Komplexität des Datenmodells ab.
In einem einfachen Modell mit einer Fact-Tabelle und mehreren Dimensionen wird zuerst die Fact-Tabelle migriert. Dabei werden die RAW-IDs als Hex-String in die neuen Tabellen geschrieben und gleichzeitig die neuen NUMERIC IDs mit einer PostgreSQL Sequence generiert. Danach kann für die Dimension-Tabellen der neue Fremdschlüssel mittels Lookup auf die RAW-ID ermittelt werden. Der Vorteil dieser Variante ist, dass sie einfach zu implementieren ist. Allerdings werden die Spalten mit der alten ID nach der Migration obsolet.
Für ein grösseres Datenmodell mit vielen Fremdschlüsselbeziehungen inklusive Selbstreferenzen kommt dieser Ansatz nicht infrage. Stattdessen erstellen wir eine Mapping-Tabelle, in die wir zuerst alle alten IDs als Hex-String schreiben und dabei gleichzeitig mit einem Informatica Sequence-Generator die neue ID erstellen. Bei der eigentlichen Migration kann die neue ID aus dieser Tabelle mittels Lookup ermittelt werden.
Verarbeitung im DWH
Das DWH wird weiterhin auf Oracle betrieben. Einige der migrierten Tabellen werden im DWH in einer historisierten Form gespeichert. So stehen Daten, die in der Quelle gelöscht werden, weiterhin zur Verfügung. Um die Konsistenz zu wahren, müssen wir auch in diesen Tabellen die alte binäre ID durch eine neue numerische ersetzten. Dazu verwenden wir denselben Sequence-Generator aus Informatica.
Ansonsten werden die IDs im DWH nur für Joins verwendet. Somit müssen für die weitere Verarbeitung in Informatica lediglich die Datentypen angepasst werden.
Zusammenfassung
Das hier beschriebene Beispiel zeigt, dass eine scheinbar einfache Migration von Oracle nach PostgreSQL einiges an Aufwand verursachen kann. Obwohl (vermeintlich) alle Systeme auf UTF‑8 eingestellt waren, hatten wir zuerst Probleme mit der Verarbeitung der Codepage. Die Details sind in diesem Fall spezifisch für Informatica PowerCenter. Aber Fehler aufgrund der Codepage treten leider oft auf, was eine umfassende Analyse und Tests vor der Migration nötig machen.
Unser Beispiel betrifft nicht eine 1:1 Migration, sondern einen Fall, wo gleichzeitig Datentypen angepasst werden. Da es sich dabei um Schlüsselfelder handelt, ist der Aufwand dafür speziell gross. Zuerst muss bei der Migration die Konsistenz der Fremdschlüsselbeziehungen sichergestellt werden. Danach passen wir die Verarbeitung im DWH auf den neuen Datentyp an.
Bei einer Migration der Datenbanksysteme stehen sich die laufenden Kosten für Lizenzen und Wartung den initialen Kosten gegenüber. Die initialen Kosten betreffen dabei nicht nur das eigentliche «Verschieben» der Daten, sondern insbesondere auch die Verarbeitung ab dem neuen System. Je nach verwendeter ETL-Technologie und ‑Logik kann der Aufwand stark variieren. Im besten Fall sind keine weiteren Anpassungen nötig (gleiche Daten ab neuer Quelle). Im schlechtesten Fall müssen viele Verarbeitungsschritte auf das neue Quellsystem angepasst werden (neuer Syntax). Bei der Entscheidung, ob man eine Migration in Angriff nehmen will, müssen all diese Faktoren berücksichtigt werden.
Erfahren Sie hier mehr über Lösungen im Bereich Data Management oder besuchen Sie eines unserer kostenlosen Webinare.