Какие основные причины могут привести к сбою миграции базы данных?

«Какие основные причины могут привести к сбою миграции базы данных?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные причины и примеры:

  1. Ошибки в SQL-скрипте: Синтаксические ошибки или невалидные операции.

    -- V2__add_column.sql
    ALTER TABLE users ADD COLUMN email UNIQUE; -- Ошибка: не указан тип данных
    -- Исправить: ALTER TABLE users ADD COLUMN email VARCHAR(255) UNIQUE;
  2. Конфликт версий или порядка: Попытка применить уже выполненную миграцию или пропуск обязательной зависимости.

    Состояние БД: выполнены миграции V1, V3.
    Запуск: flyway migrate (пытается применить V2).
    Проблема: Пропущен номер V2, но применён V3. Может вызвать ошибку, если V3 зависит от V2.
  3. Несовместимость с текущей схемой: Изменение, противоречащее существующим данным или структуре.

    -- V2__make_email_not_null.sql
    ALTER TABLE users ALTER COLUMN email SET NOT NULL;
    -- Сбой, если в таблице уже есть строки с NULL в email.
  4. Проблемы с правами доступа: У учётной записи, от которой запускается миграция, нет прав на CREATE, ALTER, DROP.

  5. Блокировки (Deadlocks): Долгие транзакции или другие процессы удерживают эксклюзивные блокировки на целевые таблицы.

  6. Проблемы окружения: Различия в СУБД (синтаксис MySQL vs PostgreSQL), кодировках или настройках.

Как предотвратить:

  • Использовать flyway validate для проверки скриптов.
  • Применять транзакции для отката неудачных миграций (где поддерживается).
  • Тестировать миграции на staging-окружении, идентичном production.
  • Использовать идемпотентные скрипты, где это возможно.
    -- Идемпотентное добавление столбца (для некоторых СУБД)
    ALTER TABLE users ADD COLUMN IF NOT EXISTS phone VARCHAR(20);