Нужно переименовать колонку name в full_name без простоя при rolling-выкатке. Какая последовательность верна?
- Как переименовать колонку без простоя?
- Что такое parallel change?
Expand–contract в пять шагов: добавить full_name → писать в обе колонки → перелить старые данные порциями → читать из новой → удалить name отдельным поздним релизом.
- Прямой RENAME мгновенно ломает работающие экземпляры старой версии
- Бэкфилл — пачками, а не одним UPDATE: длинная транзакция держит блокировки и раздувает таблицу
- Индексы — CREATE INDEX CONCURRENTLY
А ещё На любом шаге можно остановиться и откатиться
Подробно
Почему не RENAME. В момент переименования старые экземпляры продолжают писать в name и падают. Даже если выкатка мгновенная, откат вернёт код, который не знает full_name.
Шаги:
- Expand — миграция
ADD COLUMN full_name(nullable, без значения по умолчанию, чтобы не переписывать таблицу). Код не меняется. - Двойная запись — релиз кода, который пишет в обе колонки, а читает ещё старую. После выкатки все новые и изменённые строки имеют обе.
- Бэкфилл — перенос старых строк порциями:
UPDATE ... SET full_name = name WHERE id BETWEEN ... AND full_name IS NULLпо несколько тысяч, с паузами. Один большой UPDATE держит блокировки, генерирует огромный WAL и отставание реплик. - Переключение чтения — релиз, который читает
full_name(и пишет ещё в обе — на случай отката). - Contract — когда старых версий нигде нет и откат на них не нужен: код перестаёт писать в
name, затем отдельной миграциейDROP COLUMN name.
Детали: ограничения (NOT NULL) добавлять после бэкфилла, в PostgreSQL — через CHECK ... NOT VALID и последующий VALIDATE, чтобы не блокировать таблицу; индексы — CONCURRENTLY; инструменты вроде gh-ost или pg-osc для тяжёлых изменений.
Что хотят услышать
- Почему прямой RENAME ломает rolling-выкатку.
- Пять шагов expand–contract по порядку.
- Бэкфилл порциями и неблокирующие индексы.
- Удаление старого — последним отдельным релизом.
Частые ошибки
- Делать бэкфилл одним UPDATE на всю таблицу.
- Удалять старую колонку в том же релизе, где переключили чтение.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Выполнить ALTER TABLE ... RENAME COLUMN вместе с выкаткой нового кода
- ✓Новая колонка → запись в обе → перелив данных → переключение чтения → удаление старой позже
- ✗Создать новую таблицу, скопировать данные и переключиться одним релизом
- ✗Переименовать колонку ночью, когда нагрузка минимальна
Что спросят дальше
- Почему фазу удаления откладывают?
- Чем помогают Flyway и Liquibase и чего они не решают?
Разбор темы
- Выкатка без простоя и миграции схемы
Rolling, blue-green и canary с их ценой, отделение деплоя от релиза через feature flags, expand–contract для схемы БД, совместимость соседних версий и стратегия отката.
Связанные вопросы
- Во время rolling update в проде одновременно работают старая и новая версии сервиса. Какое требование из этого следует? Middle
- Как вы спланируете выкатку изменения, затрагивающего и код, и схему базы, чтобы её можно было безопасно откатить? Middle
- Какие изменения REST API обратно совместимы для существующих клиентов? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.