Zero-downtime migrations are a sequence of small, reversible steps — not one big ALTER on Friday evening.
Add new columns as nullable, backfill in batches, deploy code that reads both paths, then remove the old path once traffic proves safe.
- Avoid long locks: batch work, use indexes intentionally
- Test rollbacks and forward fixes
- Monitor query plans after changes
Treat migrations like product releases: measurable, observable, and owned end-to-end.