Decide if you actually need a migration
1-2 hr
Add nullable column. Zero-downtime. Backfilled in 3 hr.
Pick the migration strategy
2-4 hr
Rejected: code references not yet removed. Re-queue after PR #1421.
Write the expand step (additive only)
1 day
PR #1421 merged. Drop succeeded. Verified via post-deploy query.
Ship the dual-write app code
1-2 days
Add nullable timestamp column. Backfilled in 90 min.
Backfill the existing data
Hours to days depending on table size
Verify the new column is correct
1-2 days
Switch reads to the new column
1-2 days
Stop dual-writes (the contract step, part 1)
1 day
Drop the old column (the contract step, part 2)
1 day to drop, weeks of waiting beforehand
Postmortem the migration + extract patterns
1-2 hr