Testgetriebene Datenmigration

Gegenüber existierenden ETL-Lösungen, die vor allem im Data-Warehouse-Bereich eingesetzt werden, erlaubte uns die individuelle Lösung eine sehr leichte Wiederverwendung der Validierungslogik des Zielsystems. Durch die Aufteilung der Datentransformation in einen SQL-basierten Teil in der migrationsspezifischen View und einen Java-Teil im Migrationscode konnten wir je nach Anwendungsfall und den jeweiligen speziellen Anforderungen die Vorteile beider Ansätze nutzen.

Ein im Projektverlauf sehr nützliches Feature des Frameworks besteht im integrierten Logging. Für jeden migrierten Datensatz wird ein eigener Eintrag in einer speziellen Datenbanktabelle geschrieben, bei dem u. a. die IDs von Quell- und Zieldatensatz, eine Zusammenfassung des Migrationsstatus (z. B. OK, SKIPPED, WARNING, ERROR) und ein Freitext, der z. B. Stacktraces im Fehlerfall enthalten kann, notiert sind. Darüber hinaus wird für jede Einzelmigration ein Gesamtergebnis in einer weiteren Tabelle aufgezeichnet, das die Anzahl der migrierten Datensätze nach dem Migrationsstatus aufsummiert. Damit kann man sofort nach dem Durchlauf einer Migration auf einen Blick einen Eindruck der Datenqualität erhalten (Abb. 2).

Abb. 2: Gesamtergebnis einer Migrationssuite. Abb. 2: Gesamtergebnis einer Migrationssuite. Für jede Teilmigration wird angegeben, wie viele Datensätze jeweils erfolgreich oder mit Warnungen migriert werden konnten und wie viele Datensätze aufgrund von Problemen mit der Datenqualität oder im Programmcode nicht migriert werden konnten (Vergrößern)

Testautomatisierung

Da sowohl das Quell- als auch das Zielsystem aktiv täglich benutzt und auch weiterentwickelt wurden, war rasch klar, dass wir nur mit einer vollständigen Automatisierung der Ausführung des Migrationscodes auf Testsystemen das Ziel eines reibungslosen Übergangs erreichen konnten. Zunächst war es erforderlich, die Migration zu skripten. Wir benutzten dafür Apache Ant [2], da wir so nur eine Skriptumgebung benötigten, um den Migrationscode zu bauen und auch auszuführen. Die Migration konnte so durch den Aufruf eines einzigen Befehls, dem als Parameter noch die Umgebung (Development, Integrationstest oder Produktion) mitgegeben wurde, vollständig durchgeführt werden.

Um jederzeit die Datenqualität der Bestände von Quell- und Zielsystem in Verbindung mit dem aktuell vorhandenen Migrationscode beurteilen zu können, setzten wir Integrationstestumgebungen auf, die per Skript mit identischen Kopien der Produktionsumgebung befüllt wurden. Auf diesem System konnten wir nun die Migration testweise durchführen und so sofortiges Feedback zur Frage „Was wäre, wenn wir heute produktiv migrieren würden?“ erhalten. Hierbei kamen uns beim Handling der großen Datenmengen und der Reproduktion von Tests zwei Oracle-Features sehr gelegen. Zum einen erlaubte uns Data Pump [3], selbst umfangreiche Datenbestände in sehr kurzer Zeit zu kopieren. Unmittelbar nach dem Erstellen einer Kopie setzten wir dann mittels Flashback [4] einen Restore Point, der uns sehr kurze Feedbackzyklen ermöglichte – wir konnten Migrationscode ausführen, das Ergebnis inspizieren, den Code daraufhin anpassen und via Flashback innerhalb einer Minute den Zustand der Datenbank auf den Stand vor der Migration zurückrollen, sodass der nächste Test sofort durchgeführt werden konnte. Eine Einschränkung von Flashback besteht leider darin, dass nur komplette Datenbanken, nicht jedoch einzelne Schemas zurückgesetzt werden können.

Sowohl für die Weiterentwicklung des Zielsystems als auch für die eigentliche Migration waren Änderungen an Datenbankschemas und zum Teil auch an Stammdaten nötig. Durch das Open-Source-Tool DbMaintain [5] konnten wir diese Änderungen als Sammlung inkrementeller SQL-Skripte einfach in der Versionsverwaltung halten und durch die Ant-Integration ebenso leicht in die geskriptete Ausführung der Migration integrieren. Abbildung 3 fasst die zur Testausführung nötigen Schritte im Überblick zusammen.

Abb. 3: Die Einzelschritte eines Migrationslaufs im Überblick
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.