A VARCHAR(32) becoming an ENUM, on a table with four hundred writes a second.
release 1 add status_v2 ENUM, nullable.
write BOTH. read the old one.
backfill batched, nine days, with a lag-aware sleep
release 2 read status_v2. still write both.
release 3 stop writing the old column. add NOT NULL.
release 4 drop the old column.
six weeks. no lock longer than a second at any point.
Four releases for a column type is the honest cost of not being able to take a lock, and every individual step is an operation the pipeline does routinely. The alternative — a four-hour ALTER during a maintenance window — is one step and requires a maintenance window, which this system does not have.