The migration stalled at the schema change. Everyone stared at the log: ALTER TABLE ... ADD COLUMN. A new column should be simple. It never is.
Adding a new column in production is one of those moments where precision and control matter more than speed. The shape of your data changes. Every query, every index, every dependent service feels the shift. If you get it wrong, rollback is rarely clean.
Start with the schema definition. Decide the exact column name, type, nullability, and default value. Avoid implicit conversions. If the column is required, backfill data before enforcing NOT NULL. For large tables, backfills can trigger lock contention or replication lag. Plan them in controlled batches.
Use zero-downtime migration patterns. Add the column without constraints first. Deploy application code that writes to both old and new fields. Verify reads. Only after the system runs clean should you enforce constraints and drop any deprecated columns.