Базы данных
Миграции схемы: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый отражает решение, которое ты принимаешь, выкатывая изменение схемы на живую базу под трафиком — не определение для заучивания, а режим отказа, от которого надо защититься.
Убедись, что связываешь поведение блокировок, безопасные DDL-перезаписи, фазы expand-contract, радиус поражения бэкфилла и порядок деплоя — тот синтез, к которому вели семь уроков.
На PG 16 деплой выполняет statement ниже, и он завершается за 8 мс, но таблица users возвращает 503 в течение 70 секунд. На users уже выполнялся 60-секундный аналитический SELECT, когда сработал ALTER. Что на самом деле заморозило таблицу? ```sql ALTER TABLE users ADD COLUMN status TEXT DEFAULT 'active'; ```
Тот же мгновенный ALTER из вопроса 1 продолжает таймаутиться за долгими запросами. Какое одно изменение превращает «миграция замораживает базу» в «миграция логирует ошибку и ретраит»?
Нужно добавить FOREIGN KEY к таблице orders на 100M строк, не блокируя записи. Какой подход production-безопасен?
Rolling-деплой переименовывает users.username в users.handle. Чтобы и старая, и новая версии приложения работали в каждый момент, какой порядок шагов верен?
Бэкфилл выезжает одним statement на таблице в 100M строк. На связке primary + 2 реплики что ломается первым и какой устойчивый фикс? ```sql UPDATE users SET handle = username WHERE handle IS NULL; ```
Три реплики Kubernetes стартуют одновременно, и каждая выполняет migrate up при запуске. Одна успешна; две падают с ошибками дублирования объекта. Чего не хватало и какой более чистый production-паттерн?
Сквозная линия юнита — один защитный чек-лист для каждого изменения схемы. Блокировки: большинству DDL нужен ACCESS EXCLUSIVE, и FIFO-очередь превращает один медленный запрос в заморозку таблицы — SET lock_timeout, чтобы неудачная попытка прервалась и ретраила. Перезаписи: константный дефолт мгновенен с PG 11, volatile-дефолты всё ещё перезаписывают. Constraints и индексы: NOT VALID + VALIDATE и CREATE INDEX CONCURRENTLY берут SHARE UPDATE EXCLUSIVE и оставляют DML работающим. Ломающие изменения: expand-contract держит старый и новый код совместимыми в каждый момент, никогда не одношаговый rename. Бэкфиллы: батчь, чтобы ограничить WAL-флуд и replica lag. Раннеры: сериализуй advisory lock’ом и гейти pre-deploy job перед выкаткой. Каждый ответ сводится к одному инварианту — схема должна оставаться совместимой с обеими версиями кода, в каждый момент, не замораживая таблицу.