Files
huncode b28d2c14cf
Build and deploy / deploy (push) Successful in 14s
revise April 2024 data migration articles
2026-07-31 15:46:48 +03:00

45 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P74 · 2024-04 · Безопасная миграция данных — три самостоятельных прохода
## Рамка sidecar-пакета
- Slug: editorial-2024-04-practice-data-migrations, editorial-2024-04-mechanism-data-migrations, editorial-2024-04-field-data-migrations.
- Голос: M7, апрель 2024. Автор не обещает «zero downtime» и не пересказывает инструменты. Он начинает с цены несовместимой схемы и невосстановимого contract, затем коротко ведёт через «симптом → причина → проверка → действие», owner, границу доказательства и следующий шаг.
- Созданы ровно пять sidecar-файлов: этот review, один import-safe script и три локальных SVG. Overlay, README, articles.json, очередь, Git, staging, commit/push и чужие файлы не менялись. Пакет не интегрирован.
- Fixture работает только с fixed marked synthetic JS records в памяти. Он не открывает database, не исполняет SQL, не читает файлы, repository, environment, часы, CI output, сеть или HTTP. Он не запускает migration, rehearsal, backfill или нагрузочное измерение и не делает production claim. PASS говорит только о согласованности учебного контракта.
## Проход 1 — факты, источники и модель
- Первичные источники проверены 31.07.2026 и исторически доступны к апрелю 2024. [Stripe Engineering: Online migrations at scale](https://stripe.com/blog/online-migrations) опубликован 02.02.2017 и описывает их четыре фазы: dual write, переключение readers, переключение writers, удаление старого. Это case Stripe с их storage, Hadoop и Scientist experiments, а не default-параметры чужой базы.
- [PostgreSQL 16: ALTER TABLE](https://www.postgresql.org/docs/16/sql-altertable.html) документирует для PostgreSQL 16 разницу между non-volatile/volatile default, table rewrite, NOT VALID и VALIDATE CONSTRAINT; [официальный релиз PostgreSQL 16](https://www.postgresql.org/about/news/postgresql-16-released-2715/) датирован 14.09.2023. В статьях эти факты названы PostgreSQL-specific: они не переносятся на другую СУБД, ORM, managed service или реальные locks без её документации.
- [Google SRE Book: Testing for Reliability](https://sre.google/sre-book/testing-reliability/) — первичный Google source, книга существовала до апреля 2024 (официальный [preface](https://sre.google/sre-book/preface/) указывает copyright 2016 Google). Из него взято узкое правило: test уменьшает неопределённость, но pass не доказывает reliability; рискованный инструмент нуждается в барьере. Это не источник SQL-синтаксиса, capacity или database permissions.
- createFixedSyntheticMigrationInput() создаёт только один из пяти фиксированных selector-ов: compatible expand, schema ahead of old writer, unbounded backfill, contract при mixed fleet, rehearsal без rollback draft. Он не принимает произвольную базу, таблицу, URL, SQL, время, файл или scope реального проекта.
- inspectSyntheticDataMigration() использует exact closed input contract из пяти полей. Лишние databaseUrl и migrationFile, не-synthetic marker, неизвестный case и run-real-migration mode отвергаются до классификации. Результат содержит явные границы: database=not-opened, sql=not-run, filesystem=not-read, network=not-used, clock=not-read, ci=not-touched, migration=not-started, loadMeasurement=not-performed.
- Модель разделяет причины: early expand блокируется несовместимым old writer; unbounded backfill — отсутствием declared stop condition; early contract — ещё declared old version/old representation; rehearsal — отсутствием rollback draft. Это не единый verdict «миграция плохая».
- Во время независимого модельного прохода найдены и исправлены две проблемы. Сначала fixture печатал 32/31 из-за финальной assertion счётчика; затем gate с заблокированным rehearsal сохранял accepted=true, хотя state был stop. Теперь accepted означает открытый synthetic gate; смешанный fleet получает accepted=false и stop-before-human-rehearsal.
- Главная приёмка добавила безопасное canonical JSON-сравнение и требование плотных массивов для reasons/actions. Циклический внешний report отклоняется вместо исключения, разрежённый plan не даёт snapshot, а snapshot копирует actions, поэтому caller не может изменить его после возврата. Это делает fixture устойчивее, не расширяя его за пределы fixed in-memory модели.
- planSyntheticDataMigration() доверяет только canonical report, повторно сверенный с fixed record; подменённый verdict отвергается. rollbackSyntheticDataMigrationDraft() принимает только canonical plan; подменённый action не даёт snapshot. Rollback возвращает только synthetic decision draft и не обещает восстановить schema, data, files, CI, traffic, backups или production.
- Проверки модели: node --check scripts/upgrade-2024-04.mjs — PASS; node scripts/upgrade-2024-04.mjs --verify-fixture — PASS fixture: 36/36 assertions. Это не database test и не release approval.
## Проход 2 — язык, объём и голос
- Practice отвечает на вопрос, как разделить expand, migrate, switch и contract; mechanism объясняет matrix old/new reader-writer и границу between data compatibility and traffic switch; field разбирает fixed case, где backfill не имеет stop condition, а contract ещё нельзя разрешить. Тексты не маскируют один материал тремя заголовками.
- В первых двух абзацах каждой статьи названы ситуация и цена: schema ahead of code, нагрузка от неограниченного backfill, mixed fleet и rollback, который не возвращает удалённые данные. Затем в каждой статье явно проходит цепочка «симптом → причина → проверка → действие».
- В каждой ревизии есть недекоративная таблица: contract ролей и этапов, compatibility matrix либо матрица полевого разбора. Таблица отвечает на действие читателя, а не повторяет соседний текст. Example запускает только фиксированную in-memory модель и рядом называет, что она не доказывает.
- npm run audit:draft -- scripts/upgrade-2024-04.mjs зафиксировал основной текст без источников: practice — **10 439**, mechanism — **11 348**, field — **9 948** знаков. Все три статьи внутри обязательного диапазона 5 000–15 000 и целевого 9–12 тыс.
- Убраны ложные operational claims: synthetic-gate-open не назван разрешением на реальную миграцию; rehearsal не выдан за production measurement; rollback binary не приравнен к восстановлению данных; PostgreSQL и Stripe не объявлены универсальным законом для другой СУБД.
- Речь остаётся короткой и предметной для 2024 года: reader/writer, owner, evidence, stop condition и rollback boundary появляются только там, где задают проверяемую ответственность. Каждый материал заканчивается отдельным следующим шагом и ограничениями.
## Проход 3 — visual, безопасность и выпуск
- data-migrations-2024-expand-contract-timeline.svg показывает, что old representation живёт до contract и что возврат к compatible code path не обещает вернуть удалённые данные. data-migrations-2024-version-compatibility.svg отделяет v1, transition v2 и v3 по reader/writer. data-migrations-2024-rehearsal-gate.svg показывает, какие отсутствующие условия ведут в stop and review, а не в contract.
- У каждого рисунка есть независимые title и desc, а в статье — содержательные alt и caption с явной границей модели. В SVG нет внешних URL, пользовательского ввода, script, foreignObject, javascript:, data:image или event-handler attributes.
- Первый Sharp-render на ширине 375 px обнаружил два дефекта: длинный title timeline обрезался справа, а matrix вместила слишком плотные вторые строки. Title сокращён до «Миграция: старая форма живёт до contract»; matrix перепроектирована на короткие крупные labels (v1/v2/v3, old/new, expand/migrate/contract). Повторный render показывает все заголовки, стрелки, стоп-ветку и подписи без обрезания.
- xmllint --noout для трёх SVG — PASS. SVG safety scan — clean. Все три SVG прошли Sharp-render 375 px и открыты вручную после финальной корректировки. Визуалы не являются graph, snapshot или measurement реальной среды.
- Выпуск намеренно не выполнялся: overlay/README/queue не обновлялись, production build не запускался, Git/staging/commit/push отсутствуют. Это ограничение sidecar-пакета, а не пропуск проверки.
## Выпуск после трёх проходов
- Главный редактор подключил ровно три апрельские ревизии в `web/data/editorial-revisions.mjs`, не меняя архивный `articles.json`, и обновил счётчик производства до 226 из 358 материалов.
- После подключения `npm run audit:articles -- <три slug>` подтвердил объём, figure, таблицу и пример каждой статьи; registry содержит 217 уникальных ревизий без повторов slug.
- `npm run build` завершился успешно: Next.js сгенерировал 374 статические страницы. В выпуск не включены пользовательские правки и неинтегрированные sidecar-пакеты мая, июня и июля.