Миграция с CREATE INDEX остановила запись в боевую таблицу на десять минут
В рабочее время выкатили релиз. В миграции есть шаг:
CREATE INDEX orders_status_idx ON orders (status);
В таблице около 40 млн строк. Через минуту после старта деплоя сервис начал отдавать таймауты на всех операциях создания и изменения заказов; чтение при этом работало. Через десять минут, когда миграция завершилась, всё восстановилось само.
Что произошло и как выкатывать такие изменения на боевой базе?
- Проблема в объёме: на таблицах в десятки миллионов строк индексы создавать нельзя, нужна витрина
- Обычный CREATE INDEX блокирует изменение таблицы до конца построения; на проде нужен CONCURRENTLY
- Миграцию нужно было запускать из кода приложения при старте, а не отдельным шагом деплоя
- Достаточно увеличить statement_timeout — тогда запросы на запись не будут отваливаться
