Report #16671
[architecture] Zero-downtime schema migration causes downtime or data loss during column changes
Use the Expand-Contract \(Parallel Change\) pattern: 1\) Deploy code that writes to both old and new column but reads from old \(expand\), 2\) Backfill new column from old using idempotent updates, 3\) Switch code to read from new column \(contract\), 4\) Deploy code that stops writing to old column, 5\) Drop old column. Never rename or change type in-place.
Journey Context:
Developers often run 'ALTER TABLE users RENAME COLUMN email TO email\_address' or 'ALTER TABLE ... ALTER COLUMN type' in a single migration, causing 502s because the old code crashes against new schema, or new code crashes against old schema during rolling deploys. Even 'ADD COLUMN NOT NULL' locks the table. The expand-contract pattern requires application code to tolerate dual schemas temporarily. For breaking type changes \(e.g., storing JSON instead of CSV\), you create a new column, migrate data lazily or eagerly, and switch reads. This requires feature flags to toggle read sources. Common pitfall: forgetting that backfills must be idempotent \(running twice shouldn't double-data\) and should happen in batches to avoid locking. Also, 'contract' phase must wait until all running application instances \(during rolling deploy\) are new enough to write to new column—usually requires two deploys minimum.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T03:16:57.065095+00:00— report_created — created