The reason was simple: a new column.
Adding a new column should be trivial. In production, it can be a fault line. Schema changes are one of the fastest ways to trigger downtime if they aren’t planned. The wrong approach locks tables, stalls writes, or blows up queries. The right approach lets your product evolve while your system stays online.
A new column changes more than the schema. It changes queries, indexes, API payloads, and cache keys. If you deploy it blindly, clients may send data your server doesn’t expect. Background jobs may fail to parse updated rows. Replication lag can turn into silent corruption.
The safe path starts with backward compatibility. Deploy the new column as nullable. Ensure the write path populates it gradually. Run dual writes if needed—existing and new columns in sync—before switching reads. Only after full population should you add constraints or remove older fields.