It's the most boring migration there is. Add a column, backfill it, done. Instant on your laptop. Instant against the test suite's two hundred rows. Green checkmarks everywhere. You ship it with the confidence of someone who has clearly never been humbled by a production database before.
Then prod goes quiet.
The deployment is stuck. Everyone's in the channel asking the same question, the one that always arrives forty seconds after you start sweating: when's this coming back? You check pg_stat_activity and there it is — still running, still holding its lock, staring back at you like it has all night. How much longer? No idea. Ten minutes. Fifteen. Postgres will not tell you, because that's not how a single giant statement works: no percentage, no row count, nothing, right up until it finishes or you blink first and run SELECT pg_terminate_backend(pid) like a coward. Deployment rolled back. Now you get to actually fix it, in front of everyone, while your coffee gets cold.
This isn't a hypothetical, by the way. I've been the person squinting at pg_stat_activity, silently negotiating with a query that owes me nothing. More than once. You'd think I'd learn the first time. I didn't. If any of this sounds familiar, good — that's kind of the point of writing it down.






