---
id: retry-migration-until-it-passes
type: failure
title: Повторный запуск упавшей миграции до «зелёного», вместо чтения причины
status: validated
confidence: high
applicability: Любой проект, где миграция применяется частично и первый порыв — запустить её снова
tags: [sql, migration, validation, silent-corruption]
created_at: 2026-10-01
updated_at: 2026-10-22
last_verified_at: 2026-10-22
source: agent execution
related: [add-nullable-column-to-list-endpoint]
---

# Пример: запись провала

## What was attempted

Миграция схемы упала на середине на тестовой базе. В ответ её запустили трижды, затем закомментировали
падающий оператор и применили остальное.

## Symptom

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

## Root cause

DDL не атомарен across операторов на каждом движке, а частично применённая миграция оставляет схему в
состоянии, которое не описывает ни один файл миграции. Повторный запуск заново выполняет уже
выполненные операторы.

## Cost

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

## Working alternative

1. Читать первую ошибку, а не третью.
2. Снять слепок схемы до касания: `SHOW CREATE TABLE <name>` в файл.
3. Определить, какие операторы уже применились, сравнив слепок с файлом миграции.
4. Применить остаток вручную, по одному оператору, проверяя после каждого.
5. Записать фактическое состояние схемы в примечания к миграции.

## Prevention

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

## Related

`add-nullable-column-to-list-endpoint` — рецепт, чья проверка поймала вариант этого случая.
