Report #68220
[architecture] Schema migrations locking tables and causing downtime on large PostgreSQL/MySQL tables
Use the expand-contract pattern: 1\) Deploy code that writes to both old and new schema \(dual-write\) but reads from old; 2\) Backfill existing data in batches; 3\) Switch reads to new schema; 4\) Stop writing to old schema; 5\) Drop old column.
Journey Context:
Direct ALTER TABLE on large tables \(e.g., adding a non-nullable column without default\) acquires ACCESS EXCLUSIVE locks that block reads and writes for hours in PostgreSQL <11 or MySQL <8.0. Simple 'blue-green' database deployment is impossible because schema changes aren't backward compatible. The expand-contract pattern decouples schema changes from code deployment by maintaining both schemas simultaneously. The critical step is dual-writing: application code must write to both old and new columns/tables for a period to ensure consistency during the transition. For MySQL, tools like gh-ost \(GitHub's online schema change tool\) or pt-online-schema-change implement this pattern mechanically, but the conceptual pattern applies to all relational databases.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T20:59:32.983355+00:00— report_created — created