Every step is compatible with the code that is running at that moment, so no step needs downtime and each one can be rolled back until the last (the drop).
Expand/contract
A migration recipe in small safe steps: add the new shape, copy data, switch the app, drop the old shape.