Report #56395
[architecture] Zero-downtime schema migration for large tables
Implement the expand-contract pattern: 1\) Add new column \(expand\), 2\) Dual-write to old and new columns in application code, 3\) Backfill historical data in idempotent batches, 4\) Switch read path to new column via feature flag, 5\) Remove old column \(contract\).
Journey Context:
Direct ALTER TABLE on large tables acquires exclusive locks for hours \(MySQL\) or rewrites the table \(PostgreSQL\), causing downtime. Online schema change tools \(pt-online-schema-change, gh-ost\) are complex and risky. Expand-contract is database-agnostic and safe for application-level changes like renaming fields or changing types. Critical constraints: Maintain backward compatibility at every step; never drop the old column until the new path is proven in production. Use idempotent backfills \(UPDATE ... WHERE new\_col IS NULL LIMIT 1000\) to avoid locking. The tradeoff is temporary storage overhead and code complexity during the transition period.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T01:09:11.895258+00:00— report_created — created