Skip to main content
EN
Home / Zero-downtime database migration with expand and contract
Jul 04, 2026 · Z-SOFT Admin · 10 min read

Zero-downtime database migration with expand and contract

Evolve schemas safely across mixed application versions, large tables and long-running backfills.

Back to all posts

In brief: A safe schema change assumes old and new application versions will run at the same time.

The problem

Renaming a column or adding a strict constraint in one deploy breaks old instances. Large table rewrites hold locks, backfills compete with customer traffic, and rollback becomes impossible once new data has a new shape.

Why the simple answer is not enough

Rolling deploys guarantee version overlap. Database compatibility therefore has to span at least the oldest running application version and any job that may still retry.

Data movement is production traffic. It consumes I/O, cache and replication capacity and must stay behind customer-facing SLOs.

System flow

Expand
add compatible schema
Migrate
dual read or write
Verify
backfill and compare
Contract
remove old path
Compatibility is introduced first and removed only after usage and data prove the old path is unnecessary.

Architecture decisions

Prefer additive expansion

Add the new field or table first. A rename is implemented as add, copy, cut over and remove.

Make backfill resumable

Use stable key ranges, small commits and a checkpoint. Re-running a batch must be harmless.

Validate constraints separately

Create or attach constraints in a mode that minimises blocking, then validate existing rows under controlled load.

Going deeper

Rollback is a data question

Code can roll back quickly, but data written only in the new form may not. Keep a reverse-compatible path until the rollback window closes.

Constraints create confidence

After reconciliation, database constraints turn assumptions into enforcement. Add them after the data is clean, not as an emergency fix during cutover.

Implementation path

  1. Add nullable structures or new tables without changing existing behaviour.
  2. Deploy application compatibility, backfill in resumable batches, and reconcile.
  3. Switch reads with a flag, observe, then remove old code and schema in a later release.

Technical example: Resumable primary-key backfill

lastId = checkpoint.load('account_region_v2')
rows = SELECT id FROM accounts WHERE id > :lastId ORDER BY id LIMIT 1000
UPDATE accounts SET region_v2 = derive(region) WHERE id IN (:rows)
checkpoint.save(MAX(rows.id))
sleep(rateLimit)

Monitor replication lag and lock waits after each batch, and stop automatically before customer latency is affected.

Failure modes to design for

  • An old worker retries and writes only the legacy field after cutover.
  • A backfill value overwrites a newer online write.
  • Dropping the old column invalidates a prepared statement or forgotten report.

What to observe

SignalWhy it matters
Old versus new read/write countProves whether compatibility paths are still active.
Backfill progress and mismatchShows completeness and transformation correctness.
Lock wait and replica lagProtect customer traffic during migration.

How to validate the design

  • Run old and new application versions simultaneously through the migration.
  • Pause and restart the backfill at random checkpoints.
  • Inject a concurrent online update and prove the backfill does not overwrite it.

Safe rollout plan

Give expand, application compatibility, backfill, cutover and contract separate releases. Use a small tenant cohort for read cutover, maintain a fast feature-flag rollback, and schedule destructive contract only after the rollback window and audit complete.

Production checklist

  • DDL lock behaviour is tested on production-like size.
  • Backfills have rate limits, checkpoints and pause controls.
  • Contract happens only after telemetry shows zero old-path use.

Takeaway

Zero-downtime migration is a sequence of reversible releases, not one clever SQL statement.

Your strategic technology partner

Turn your business challenge into a clear roadmap.

Talk directly with the Z-SOFT team about your goals, your current situation and the best next step.

Book a consultation