Как выкатывать миграции схемы без простоя?
Ключевая идея — expand-contract: схема меняется в несколько выкатов, и на каждом шаге старая и новая версия кода работают с базой одновременно. Порядок такой: расширить схему обратно совместимо → выкатить код, который пишет и в старое, и в новое → перенести историю пачками → переключить чтение → удалить старое отдельным, более поздним выкатом. Переименование и смена типа «в лоб» запрещены: они ломают работающую версию кода в момент применения. Вторая половина задачи — блокировки. ALTER TABLE берёт исключительную блокировку и встаёт в очередь за любым долгим запросом, а за ним встают все остальные, поэтому обязательны короткий lock_timeout с повтором, CREATE INDEX CONCURRENTLY и понимание, какие операции требуют перезаписи таблицы, а какие меняют только метаданные.