-
Notifications
You must be signed in to change notification settings - Fork 0
Datenbank Migration
Um Datenbankänderungen auch in der Produktion aufspielen zu können, wurden die beiden Tools Flyway und Liquibase getestet. Dabei hat sich Flyway als einfacher in der Bedienung herausgestellt, da es sich bei den einzelnen Migrationen um SQL Skripte handelt, die einfach ausgeführt werden. Liquibase dagegen verwendet eine XML Syntax, um Änderungen an der Datenbank zu beschreiben. Deshalb wird im Folgenden die Migration mittels Flyway beschrieben.
In der Projektmappe befindet sich ein Ordner (migration) mit allen SQL Update Skripten. Der Dateiname der Skripe setzt sich immer aus einer Versionsnummer und dem Namen zusammen. Bei Start des Services überprüft Flyway welche dieser Skripte noch nicht ausgeführt wurden und führt diese aus. Die aktuelle Version der Datenbank speichert Flyway in der Migration History Tabelle, um Skripte nicht doppelt auszuführen.
Flyway lässt sich mit geringem Aufwand in das Projekt integrieren. Dazu sind nur die folgenden Schritte notwendig:
Zuerst müssen die folgenden Dependencies zum Projekt hinzugefügt werden:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
Anschließend muss das Datenbank Schema für Flyway expliziet gesetzt werden. In diesem Beispiel für den Project-Service. Zusätzliche sollte von Create auf Validate umgestellt werden, damit keine automatischen Updates von Hibernate ausgeführt werden und sichergestellt ist, dass die Datenbank zum Model passt.
#Flyway (prod)
spring.flyway.schemas=project-db
spring.jpa.hibernate.ddl-auto=validate
Zuletzt wird im Ordner 'resources' der Unterordner 'db/migration' angelegt. In diesem Ordner werden anschließend alle Migration Skripte abgelegt.
Um ein Updatescript zu generieren, kann die Konfiguraiton db-migration verwendet werden. Diese verwendet im Gegensatz zur local Konfiguration eine Postgres-DB und kein H2. Dadurch können auch Update-Skripte erstellt werden. Im Projektverzeichnis liegt ein entsprechendes docker-compose file für die Postgres-DB. Durch folgende Ergänzung in application-db-migration.properties wird bei jedem Start der Anwendung ein Updatescript erzeugt.
spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata
spring.jpa.properties.javax.persistence.schema-generation.scripts.action=update
spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=update.sql
Anschließend die Anwendung starten. Dadurch wird die Datei update.sql im root Verzeichnis des Projektes erzeugt. Diese kann als Ausgangsbasis für das Updateskript verwendet werden. Es ist empfehlenswert, mindestens die Datei zu öffnen und die Sinnhaftigkeit der Änderungen zu prüfen. Für komplexere Änderungen an der Datenbank ist es notwendig, die Skripte manuell zu schreiben.
Das neue Update Skript im Migration Ordner ablegen (Filename beachten!):
V{Major_Minor}__Name.sql
Wichtig: Version und Name werden durch ZWEI Unterstriche getrennt: __
Bsp:
V0__init.sql
V1__Dozent.sql
V1_1__Rename.sql
Beim Start des Services führt Flyway alle noch nicht ausgeführten Skripte aus. Der aktuelle Status wird in der Tabelle Schema_history gespeichert.