fix(progress): перенести профильную миграцию на V13 после аттестаций
This commit is contained in:
@@ -3,10 +3,12 @@
|
||||
**Перед любыми миграциями обязателен backup:** `./deploy/backup.sh backup`
|
||||
(см. [`../BACKUP.md`](../BACKUP.md)). Preflight не заменяет backup.
|
||||
|
||||
Два скрипта только читают данные:
|
||||
Скрипты только читают данные:
|
||||
|
||||
- `groups-courses.sql` — до миграций: проблемы, которые могут помешать;
|
||||
- `groups-courses-post.sql` — после миграций и bootstrap курса C: проверка результата.
|
||||
- `groups-courses-post.sql` — после миграций и bootstrap курса C: проверка результата;
|
||||
- `progress-v10-v13.sql` — проверка истории Flyway и колонок/индекса при переходе
|
||||
старой feature-миграции V10 на V13.
|
||||
|
||||
## До миграций
|
||||
|
||||
@@ -40,6 +42,34 @@ psql -h localhost -U lms -d lms -f deploy/preflight/groups-courses-post.sql
|
||||
- статусы аккаунтов;
|
||||
- группы без полного разбора.
|
||||
|
||||
## Переход V10 → V13
|
||||
|
||||
Нужен для любой БД, которая когда-либо применяла старую feature-миграцию
|
||||
`V10__profile_authors.sql`: dev/feature-БД и staging, ненадолго запускавший
|
||||
master-коммит `bfdae41` (out-of-order + V10). На production/master записи V10
|
||||
нет — раздел можно пропустить.
|
||||
|
||||
Порядок:
|
||||
|
||||
1. Backup: `./deploy/backup.sh backup`.
|
||||
2. Проверить состояние:
|
||||
|
||||
```bash
|
||||
psql -h localhost -U lms -d lms -f deploy/preflight/progress-v10-v13.sql
|
||||
```
|
||||
|
||||
Колонки должны быть `uuid`/nullable, индекс `lab_grades_lab_idx` — существовать
|
||||
и быть валидным; `columns_ok` и `index_ok` должны быть `true`.
|
||||
3. Если V10 есть в истории с `success=true`, удалить только эту запись истории
|
||||
(`flyway repair` или точечный `DELETE` из примера в конце скрипта). При
|
||||
`success=false` сначала проверить откат объектов; V13 идемпотентна и создаст
|
||||
недостающее.
|
||||
4. Deploy: обычный запуск применит V13.
|
||||
5. Postflight: `psql -h localhost -U lms -d lms -f deploy/preflight/groups-courses-post.sql`.
|
||||
|
||||
После V13 переход forward-only: откат на сборку без V13 не пройдёт валидацию
|
||||
Flyway. Не оставляйте `out-of-order` включённым.
|
||||
|
||||
## Что делать с результатами
|
||||
|
||||
1. Группы с нестандартными именами — разобрать вручную и заполнить поля до
|
||||
|
||||
96
deploy/preflight/progress-v10-v13.sql
Normal file
96
deploy/preflight/progress-v10-v13.sql
Normal file
@@ -0,0 +1,96 @@
|
||||
-- Preflight (только чтение): переход progress-миграции профиля V10 -> V13.
|
||||
-- Проверяет историю Flyway, тип/nullable колонок и валидность индекса.
|
||||
-- Ничего не изменяет: DELETE в конце приведён только как закомментированный пример.
|
||||
-- Пример:
|
||||
-- psql -h localhost -U lms -d lms -f deploy/preflight/progress-v10-v13.sql
|
||||
|
||||
\set ON_ERROR_STOP on
|
||||
\pset pager off
|
||||
|
||||
\echo '=== 0. Наличие progress.flyway_schema_history ==='
|
||||
SELECT to_regclass('progress.flyway_schema_history') IS NOT NULL
|
||||
AS progress_flyway_schema_history_exists \gset
|
||||
|
||||
\if :progress_flyway_schema_history_exists
|
||||
\echo '=== 1. progress.flyway_schema_history: версии 10-13 ==='
|
||||
SELECT installed_rank, version, description, type, script, success, installed_on
|
||||
FROM progress.flyway_schema_history
|
||||
WHERE version IN ('10', '11', '12', '13')
|
||||
ORDER BY installed_rank;
|
||||
\else
|
||||
\echo 'progress.flyway_schema_history не найдена: сервис ещё не применял миграции progress.'
|
||||
\echo 'Проверьте LMS_DB_URL / схему progress и повторите preflight.'
|
||||
\endif
|
||||
|
||||
\echo '=== 2. Колонки профиля: тип uuid и nullable (ok = true) ==='
|
||||
SELECT expected.table_name,
|
||||
expected.column_name,
|
||||
c.data_type,
|
||||
c.is_nullable,
|
||||
(c.data_type = 'uuid' AND c.is_nullable = 'YES') AS ok
|
||||
FROM (VALUES
|
||||
('grade_comments', 'author_account_id'),
|
||||
('lab_grades', 'updated_by_account_id')
|
||||
) AS expected(table_name, column_name)
|
||||
LEFT JOIN information_schema.columns c
|
||||
ON c.table_schema = 'progress'
|
||||
AND c.table_name = expected.table_name
|
||||
AND c.column_name = expected.column_name
|
||||
ORDER BY expected.table_name, expected.column_name;
|
||||
|
||||
\echo '=== 3. Индекс lab_grades_lab_idx: существует, валиден, определение ==='
|
||||
SELECT i.indexrelid::regclass AS index_name,
|
||||
i.indisvalid,
|
||||
i.indisready,
|
||||
pg_get_indexdef(i.indexrelid) AS definition
|
||||
FROM pg_index i
|
||||
JOIN pg_class idx ON idx.oid = i.indexrelid
|
||||
JOIN pg_namespace n ON n.oid = idx.relnamespace
|
||||
WHERE n.nspname = 'progress'
|
||||
AND idx.relname = 'lab_grades_lab_idx';
|
||||
|
||||
\echo '=== 4. Сводка: колонки и индекс готовы к V13 ==='
|
||||
SELECT
|
||||
(
|
||||
SELECT count(*) = 2
|
||||
AND bool_and(c.data_type = 'uuid' AND c.is_nullable = 'YES')
|
||||
FROM information_schema.columns c
|
||||
WHERE c.table_schema = 'progress'
|
||||
AND (c.table_name, c.column_name) IN (
|
||||
('grade_comments', 'author_account_id'),
|
||||
('lab_grades', 'updated_by_account_id')
|
||||
)
|
||||
) AS columns_ok,
|
||||
(
|
||||
SELECT count(*) = 1
|
||||
AND bool_and(i.indisvalid)
|
||||
FROM pg_index i
|
||||
JOIN pg_class idx ON idx.oid = i.indexrelid
|
||||
JOIN pg_namespace n ON n.oid = idx.relnamespace
|
||||
WHERE n.nspname = 'progress'
|
||||
AND idx.relname = 'lab_grades_lab_idx'
|
||||
) AS index_ok;
|
||||
|
||||
-- Очистка истории (НЕ выполняется этим скриптом).
|
||||
--
|
||||
-- Если старая feature-миграция V10 применена со success=true, удалите ТОЛЬКО
|
||||
-- её запись истории: объекты схемы уже созданы, а V13 идемпотентна и создаст
|
||||
-- недостающие колонки/индекс. Гард по RETURNING: ожидается ровно одна строка;
|
||||
-- если строк больше или меньше — ROLLBACK.
|
||||
--
|
||||
-- BEGIN;
|
||||
-- DELETE FROM progress.flyway_schema_history
|
||||
-- WHERE version = '10'
|
||||
-- AND script = 'V10__profile_authors.sql'
|
||||
-- AND success
|
||||
-- RETURNING installed_rank, version, script, success;
|
||||
-- -- expect exactly one row; otherwise ROLLBACK
|
||||
-- COMMIT;
|
||||
--
|
||||
-- Если V10 осталась со success=false, сначала убедитесь, что её частичные
|
||||
-- изменения откатились на уровне объектов, затем выполните `flyway repair`
|
||||
-- или удалите только неуспешную строку. V13 идемпотентна и досоздаст
|
||||
-- недостающие объекты. Перед удалением строки запустите этот preflight:
|
||||
-- все проверки должны быть true.
|
||||
--
|
||||
-- Не переставляйте V11/V12 и не включайте out-of-order.
|
||||
Reference in New Issue
Block a user