Дисциплина: ОП.08 Основы проектирования баз данных • Раздел: Тема 4. Проектирование структур баз данных (§2.2 с.7–8 программы) • Занятие: №28 (2 академических часа).
Настоящее занятие завершает проектировочно-эксплуатационный цикл учебного курса ОП.08. Если на предыдущих занятиях обучающиеся осваивали нормализацию, создание реляционных объектов, триггеры, индексы и создание клиентских форм с безопасной аутентификацией, то занятие №28 погружает будущих техников-программистов в реальную промышленную практику эволюции структур баз данных (Database Schema Evolution & Versioning).
flyway_schema_history (контрольные суммы CRC32/SHA-256, статусы исполнения, временные метки);V{Version}__{Description}.sql), скриптов отката (U{Version}__{Description}.sql) и повторяемых миграций (R__{Description}.sql);Занятие рассчитано на 2 академических часа. Ниже представлены два регламента проведения: основной (80 минут) и сокращенный (60 минут).
| Этап занятия | 80 минут | 60 минут | Содержание деятельности преподавателя и студентов |
|---|---|---|---|
| 1. Организационный момент и проблемная мотивация | 5 мин (00:00–00:05) |
4 мин (00:00–00:04) |
Приветствие, фиксация присутствующих. Проблемный кейс: падение веб-сервиса на 4 часа из-за ручного выполнения команды ALTER TABLE orders DROP COLUMN customer_phone в разгар рабочего дня. Осознание необходимости версионирования. |
| 2. Актуализация знаний и теоретический экскурс | 15 мин (00:05–00:20) |
12 мин (00:04–00:16) |
Интерактивная презентация (слайды 2–11). Разбор инструментов Flyway и Liquibase. Структура мета-таблицы flyway_schema_history, вычисление чек-сумм. Накат (migrate) и откат (rollback). Паттерн Expand/Contract при Zero-Downtime развертывании. |
| 3. Демонстрация эталонного рабочего процесса | 10 мин (00:20–00:30) |
8 мин (00:16–00:24) |
Преподаватель на проекторе демонстрирует накат baseline V1__baseline.sql, затем накат миграции V2__add_field.sql, показывает изменение содержимого flyway_schema_history, моделирует конфликт контрольных сумм и выполняет сценарий безопасного отката через U2__undo.sql. |
| 4. Самостоятельная практическая работа студентов | 40 мин (00:30–00:70) |
30 мин (00:24–00:54) |
Работа обучающихся в интерактивном листе zanyatie.html по 4 предметным сценариям: разработка DDL прямой миграции, разработка Undo-скрипта отката, протоколирование метаданных в flyway_schema_history, проведение регрессионного теста совместимости старых запросов. |
| 5. Контроль, разбор ошибок, рефлексия и ДЗ | 10 мин (00:70–00:80) |
6 мин (00:54–00:60) |
Сравнительный анализ типичных багов (отсутствие дефолтных значений у NOT NULL колонок, нарушение целостности внешних ключей). Демонстрация слайда 15 с тематическим интернет-мемом. Выставление баллов по 4-балльной рубрике. Инструктаж по резервному ДЗ. |
Эволюция схемы БД в современных продуктовых командах подчиняется принципам CI/CD. Прямой доступ разработчиков к боевым серверам блокируется; все изменения DDL оформляются в виде версионированных скриптов, хранящихся в Git.
V1__init_schema.sql -- Версионированная миграция (Versioned): выполняется строго один раз
V2__add_barcode_col.sql -- Следующая версия схемы (накат)
U2__add_barcode_col.sql -- Undo-миграция (обратный откат для версии 2)
R__recreate_views.sql -- Повторяемая миграция (Repeatable): выполняется при каждом изменении хэша файла
B3__cleanup_old_data.sql -- Baseline-миграция (базовая точка отсчета)
При первом запуске мигратора в базе данных создается техническая таблица, отслеживающая состояние каждого скрипта:
CREATE TABLE flyway_schema_history (
installed_rank INT NOT NULL PRIMARY KEY, -- Порядковый номер выполнения миграции
version VARCHAR(50) NULL, -- Номер версии (NULL для Repeatable миграций)
description VARCHAR(200) NOT NULL, -- Описание из названия файла (замена _ на пробелы)
type VARCHAR(20) NOT NULL, -- Тип: SQL, UNDO, BASELINE
script VARCHAR(1000) NOT NULL, -- Имя файла миграции (например, V2__add_barcode.sql)
checksum INT NULL, -- CRC32 или SHA-256 контрольная сумма файла
installed_by VARCHAR(100) NOT NULL, -- Пользователь БД, выполнивший накат
installed_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Дата и время наката
execution_time INT NOT NULL, -- Длительность исполнения в миллисекундах
success BOOLEAN NOT NULL -- Флаг успешности (TRUE/FALSE)
);
V{N}__*.sql замораживается. Любое ручное исправление текста примененного файла изменит контрольную сумму (checksum), что приведет к аварийной остановке сборки с ошибкой ValidateFailedException: Migration checksum mismatch for migration version X.
При непрерывном развертывании (Blue-Green или Rolling Deployments) в течение определенного времени новая и старая версии клиентского приложения обращаются к одной и той же схеме БД одновременно. Если разработчик выполнит деструктивный DDL (удаление колонки, переименование, добавление NOT NULL без дефолта), старая версия упадет с ошибкой 500.
Для предотвращения простоев применяется паттерн расширения-сжатия (Expand / Contract):
После проведения миграций разработчик обязан провести регрессионное тестирование, подтверждающее, что модификация схемы не нарушила работу существующих компонентов.
| Вектор проверки | Потенциальный риск дефекта | Регрессионный тестовый сценарий |
|---|---|---|
| Обратная совместимость INSERT | Новая колонка объявлена как NOT NULL без DEFAULT, из-за чего старый код вставки падает с ошибкой СУБД. |
Выполнение типового SQL-запроса INSERT из старой версии клиента (без упоминания новой колонки). Запись должна успешно создаваться. |
| Стабильность представлений и процедур | Переименование или перенос полей ломает скомпилированные представления (VIEW), функции и триггеры. |
Вызов представлений и сохраненных процедур. Проверка состояния системного каталога на отсутствие инвалидированных объектов. |
| Производительность (Query Performance) | Отсутствие или повреждение индексов после реструктуризации приводит к переходу СУБД в режим полного сканирования (Seq Scan / Table Scan). | Анализ плана выполнения тяжелых запросов через EXPLAIN ANALYZE до и после миграции. Контроль времени отклика сводных отчетов. |
| Идемпотентность и обратимость | Скрипт миграции падает при повторном запуске, либо откат оставляет в базе "фантомные" объекты. | Тестовый накат: Migrate → Rollback → Migrate. Схема базы до и после цикла должна быть побайтово идентична. |
ALTER TABLE goods ADD COLUMN barcode VARCHAR(13) NOT NULL;DEFAULT 'DEFAULT_VALUE' либо добавления ограничения в два этапа.
V1__baseline.sql вместо создания миграции V2__fix_column.sql.flyway_schema_history.checksum и падение сборки.flyway_schema_history (версия, описание, тип, хэш, статус); исчерпывающие и аргументированные ответы на теоретические контрольные вопросы.Штрафные вычеты: синтаксическая ошибка DDL — -0.5 б.; отсутствие зеркальности в Undo-скрипте — -0.5 б.; пропуск регрессионного теста — -0.5 б.; отсутствие ответов на вопросы самопроверки — -0.5 б.