Make the change compatible first
Add the new field in a way that old and new application versions can coexist, then deploy code that can read both forms or tolerate the field being empty. Avoid making it immediately required if existing rows have not been populated.
Process rows in bounded batches using a stable key and checkpoint progress. Choose batch size and pacing from observed database load, and make each update safe to repeat if the worker stops partway through.
Verify completion before tightening rules
Track rows remaining, failures, write latency, and replication health. Compare a sample of populated records with the source values and investigate mismatches rather than marking the job done from processed-row count alone.
Only after the backfill is complete should you consider enforcing non-null constraints or removing compatibility code. Keep a pause and resume mechanism so the operation can be throttled if production load changes.