EMZETT.
Login

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

  1. Expand (Erweitern): Neue Spalte/Tabelle hinzufügen (nullable oder mit Standardwert), nichts Altes entfernen.
  2. Schreiben in beide: Die Anwendung schreibt alt und neu (Doppelschreiben) und liest weiter aus dem Alten.
  3. Backfill: Bestehende Daten in Etappen (Batches) in die neue Struktur kopieren.
  4. Lesen umstellen: Anwendung liest aus dem Neuen (Feature-Flag, Prüfen).
  5. 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