The migration had broken. The logs showed green, but the data told a different story. A missing new column had silently cut rows in half and killed the deployment.
A new column in a database is simple in theory: name it, set a type, choose constraints. In production, it is a high-risk operation. Adding a column rewrites schema, shifts indexes, and triggers code paths you may not have tested in months. If the column has a default value or is not nullable, the database must update every row. On large tables, this can lock writes and burn CPU.
Plan the new column as part of the schema evolution process. First, add the column with a safe default or nullability to avoid table-wide rewrites. Deploy application code that writes to and reads from both the old and new columns if needed. Backfill the data in controlled batches. Only when the data is fully migrated should you apply constraints and drop temporary compatibility logic.