Schema-Änderungen ohne Ausfall: Expand und Contract
Kurz: Bei Expand-and-Contract wird ein Datenbankschema in mehreren abwärtskompatiblen Schritten geändert, sodass alte und neue Programmversionen währenddessen funktionieren und kein Ausfall nötig ist.
Genauer: Eine Spalte umzubenennen klingt einfach. Läuft die App aber in mehreren Instanzen oder gibt es Rollbacks, kann ein harter Wechsel alles zerlegen: Während des Deployments arbeiten alte und neue Version gleichzeitig. Daher teilt man Änderungen in kompatible Schritte.
Im Detail
Das Muster
- Expand (Erweitern): Neue Spalte/Tabelle hinzufügen (nullable oder mit Standardwert), nichts Altes entfernen.
- Schreiben in beide: Die Anwendung schreibt alt und neu (Doppelschreiben) und liest weiter aus dem Alten.
- Backfill: Bestehende Daten in Etappen (Batches) in die neue Struktur kopieren.
- Lesen umstellen: Anwendung liest aus dem Neuen (Feature-Flag, Prüfen).
- Contract (Aufräumen): Erst wenn keine Version mehr das Alte nutzt, wird die alte Spalte entfernt.
Beispiel: Spalte name aufteilen in vorname und nachname
-- 1. Expand
ALTER TABLE nutzer ADD COLUMN vorname text, ADD COLUMN nachname text;
-- 2. App schreibt name, vorname, nachname
-- 3. Backfill in Batches
UPDATE nutzer SET vorname = split_part(name,' ',1), nachname = split_part(name,' ',2)
WHERE id BETWEEN 1 AND 10000 AND vorname IS NULL;
-- 4. App liest vorname/nachname
-- 5. Contract (später, separat)
ALTER TABLE nutzer DROP COLUMN name;Gefährliche Operationen
- Spalte umbenennen oder löschen, solange alte Programmversionen sie nutzen.
- NOT NULL ohne Standardwert auf großer Tabelle (kann Tabelle sperren).
- Index erstellen ohne
CONCURRENTLY(PostgreSQL) blockiert Schreibzugriffe. - Typ ändern (schreibt Tabelle um).
- Große Updates in einer Transaktion (Sperren, Replikationsverzögerung). Immer in Batches.
- Migrationen und Deployment müssen zeitlich abgestimmt sein.
Praxis
Teste Migrationen an einer Kopie mit realistischen Datenmengen. Backups vor kritischen Schritten, Rollback-Plan, Migrationen versionieren und im Repository halten. Werkzeuge: Flyway, Liquibase, Alembic, Prisma Migrate, Drizzle Kit, gh-ost/pg-osc für große Tabellen. Prüfe, ob ein Wartungsfenster für kleine Systeme einfacher ist als aufwendige Mehrschritt-Verfahren.
Siehe auch: Datenbank-Migration, Blue-Green- und Canary-Deployment, Feature Flags, Backup-Strategie