Datenbankmigrationen ohne Ausfallzeit
Kurz: Schemaänderungen im laufenden Betrieb gelingen ohne Ausfall, wenn man sie in kleine, abwärtskompatible Schritte zerlegt („Expand and Contract”).
Genauer: Beim Ausrollen laufen kurzzeitig alte und neue Programmversion nebeneinander auf derselben Datenbank. Das Schema muss beide verstehen.
Im Detail
- Expand: Neue Spalten oder Tabellen hinzufügen, ohne Altes zu entfernen. Neue Spalten nullbar oder mit Standardwert anlegen.
- Migrate: Neue Programmversion schreibt in beide Orte (alt und neu). Bestandsdaten in kleinen Stapeln im Hintergrund umkopieren.
- Contract: Erst wenn alles umgestellt und geprüft ist, Altes in einem späteren Release entfernen.
- Beispiel Spalte umbenennen: Nicht
RENAME, sondern neue Spalte anlegen, doppelt schreiben, kopieren, Lesen umstellen, alte Spalte später löschen. - Gefährliche Befehle: Je nach Datenbank sperren
ADD COLUMNmit Standardwert, Indexaufbau (CREATE INDEX CONCURRENTLYnutzen) oder Typänderungen die ganze Tabelle. - Rückweg: Jeder Schritt sollte einzeln rückgängig machbar sein. Migrationen versionieren und in der Pipeline ausführen.
- Werkzeuge: Flyway, Liquibase, Prisma Migrate,
gh-ost(MySQL).
Siehe auch: Transaktionen und ACID