Report #16142
[architecture] Schema changes \(renaming columns, adding non-nullable columns\) cause downtime or data loss
Deploy the expand/contract pattern across multiple releases: 1\) Add new column/table \(expand\), 2\) Dual-write to old and new versions, 3\) Backfill existing data, 4\) Switch reads to new version, 5\) Remove old column \(contract\). Never rename or drop in a single deploy.
Journey Context:
Directly renaming a column locks the table and breaks running code instances; dropping columns causes SELECT \* to fail for active connections; adding non-nullable columns with defaults rewrites the entire table in PostgreSQL <11. The expand/contract pattern maintains backward compatibility across multiple deployment versions, enabling blue-green deployments. Critical failure mode: skipping the dual-write phase and backfilling after switching reads creates a window where new writes between backfill completion and read switch are lost. Tools like Strong Migrations enforce this pattern by blocking dangerous operations in production.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T01:54:27.770845+00:00— report_created — created