Как изменить схему базы без разрыва совместимости

План расширения схемы, переноса данных, переключения чтения и удаления старого поля с проверкой отката.

Практическое решение · 3 мин чтения
Как изменить схему базы без разрыва совместимости — tarasovcode
Базы данныхКак изменить схему базы без разрыва совместимости

Поле полного имени требуется заменить отдельными частями, но несколько версий приложения некоторое время работают одновременно. Одномоментное переименование колонки создаст ошибки в старых процессах. Решение строится как последовательность совместимых состояний, каждое из которых можно проверить до следующего шага.

Что подготовить

  • Список читателей и писателей изменяемого поля, включая фоновые задачи, отчеты и интеграции.
  • Размер таблицы, ограничения блокировок, доступное окно работ и способ восстановления.
  • Правила преобразования спорных значений и критерий завершения переноса.

Порядок работы

  1. Добавьте новые поля, сохранив старое. Определите допустимость пустых значений на переходном этапе и не вводите преждевременное обязательное ограничение.
  2. Разверните совместимую запись в обе формы или другой согласованный механизм синхронизации. Опишите поведение при частичной ошибке.
  3. Переносите исторические записи небольшими повторяемыми порциями с контрольной позицией. Обрабатывайте только записи, которым еще нужен перенос.
  4. Сверяйте новое представление со старым и отдельно складывайте неоднозначные случаи. Не угадывайте части имени по количеству пробелов.
  5. Переключите чтение после проверки покрытия. Удаляйте старое поле лишь после исчезновения старых клиентов и окончания согласованного периода наблюдения.

Разобранный пример

В учебной таблице десять миллионов записей. Обработка по тысяче строк сохраняет контрольный идентификатор после каждой успешной порции. При падении на порции 315 процесс продолжает с последней подтвержденной позиции, а проверка заполнения позволяет безопасно повторить спорную порцию.

Как проверить результат

  • Старая версия приложения продолжает читать и записывать во время первых этапов.
  • Повторный запуск переноса не повреждает уже обработанные записи и не теряет новые изменения.
  • Проверен возврат чтения к старой схеме до разрушительного шага.

Если что-то пошло не так

Если перенос отстает от новых записей, остановите переключение чтения и найдите источник рассинхронизации. Удаление старой колонки не является обычным откатом: после него потребуется отдельная процедура восстановления данных. Отметьте эту границу в плане явно.

Промпт для разбора ваших материалов

Составь поэтапный план миграции по приложенной схеме. Для каждого этапа перечисли совместимые версии приложения, проверки данных, возможные блокировки и способ возврата. Отдельно обозначь необратимые действия и случаи, которые нельзя преобразовать автоматически.

Частые вопросы

Достаточно ли резервной копии?

Копия полезна только вместе с проверенной процедурой восстановления и допустимым временем простоя. Она не заменяет совместимость версий.

Когда вводить обязательность нового поля?

После подтвержденного заполнения истории и обновления всех путей записи. Иначе ограничение сломает еще работающие старые процессы.

Материал библиотеки решений Ильи Тарасова / TarasovWeb.

Матрица совместимости при постепенном выпуске

До запуска составьте четыре сочетания: старая версия приложения со старой схемой, старая с расширенной, новая с расширенной и откат приложения после начала записи новых данных. Последнее сочетание часто забывают. Возврат бинарного файла не отменяет уже изменённые записи, поэтому план отката должен описывать и данные.

В учебном примере поле display_name заменяется на public_name. Сначала добавляется новое поле без удаления старого. Затем приложение учится читать выбранный источник и поддерживать совместимую запись. Перенос исторических значений выполняется отдельно с журналом обработанных диапазонов. Только после проверки читателей, фоновых задач и экспортов можно обсуждать удаление старого поля. Точный порядок зависит от модели данных; это схема рассуждения, а не универсальный SQL-скрипт.

Для переноса сформулируйте правило повторного запуска. Если процесс остановился на середине, новая попытка не должна затирать более свежие пользовательские изменения. Сверяйте количество обработанных записей, пропуски и выборочные значения, а не только отсутствие ошибки выполнения.

Назначьте владельца каждого перехода и условие остановки: рост ошибок чтения, расхождение полей или длительная блокировка. Небольшая проверочная порция покажет, соответствует ли фактическая нагрузка предположениям. Сохраните перечень потребителей старой схемы, включая отчёты и интеграции, иначе удаление поля может сломать компонент, который не входит в основной выпуск.

О проекте

Практическая библиотека Ильи Тарасова и TarasovWeb. Telegram-канал · Личная страница · ВКонтакте.

#tarasovweb #ИльяТарасов