The expand-contract pattern
Add new tables or nullable columns first, deploy application code that writes to both old and new paths, backfill data, then switch reads, and only then remove legacy fields. Each step is deployable on its own.
Long-running backfills
Chunk work in batches with rate limits so you do not starve production traffic. Track progress and make jobs resumable after failure.
Feature flags
Ship code dark, enable gradually for internal testers, then a percentage of users. Flags should have owners and retirement dates so you do not accumulate dead branches.
Operational checks
Monitor error rates, queue depth, and database load during deploy windows. Automate smoke tests on critical flows immediately after release.