本文へ移動
cccskills
無料GitHub で公開

migration-rollout

设计数据库迁移、回填、灰度切换和回滚方案时使用。适用于生产表结构变更、大表迁移、数据修复和上线前评审。融合 Strangler Pattern + Expand/Contract + 双写校验 + 在线 DDL。

インストール方法を見る

含まれるファイル(5)

  • SKILL.md10.2 KB
  • references/migration-rollout-guide.md9.1 KB
  • references/online-migration-guide.md582 B
  • templates/migration-plan-template.md1.3 KB
  • templates/rollback-checklist-template.md1.2 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

迁移与上线(Migration & Rollout)

参考来源:Martin Fowler《Refactoring Databases》Expand/Contract 模式、Sam Newman《Building Microservices》、GitHub gh-ost、Percona pt-online-schema-change、Stripe / Shopify 大表迁移实践。

适用场景

  • 新增、修改、删除表和字段
  • 大表回填、数据修复、历史数据清洗
  • 新旧字段双写、灰度切换、兼容窗口
  • 新增或删除索引、约束、外键
  • 库间数据迁移(拆库 / 合库 / 跨数据中心)
  • 输出上线计划、回滚计划和验证清单

核心原则

1. 生产迁移不是单条 DDL
   先兼容 → 再切换 → 最后清理

2. 先备份,再变更,最后验证
   任何不可逆操作都必须拆阶段

3. Expand/Contract 模式(数据库重构核心思想)
   Expand:加新字段,新旧并存
   切换:双写、回填、双读
   Contract:删旧字段

4. 应用代码与 schema 解耦发布
   schema 变更应能独立于代码部署

5. 大表 = 数据库 ≥ 1GB 或 ≥ 1000 万行
   大表迁移必须考虑锁表 / 复制延迟 / 磁盘

6. 灰度先于全量
   关键变更:5% → 50% → 100%

7. 回滚永远可执行
   不可逆操作必须有数据备份

Expand / Contract 模式(重命名列示例)

目标:把 user.username 重命名为 user.display_name

阶段 1:Expand(兼容变更)
  ALTER TABLE users ADD COLUMN display_name varchar(100);
  -- 老代码继续读写 username
  -- 新代码同时写两列

阶段 2:双写
  -- 部署新代码
  -- 触发器或应用层同步:username → display_name
  CREATE TRIGGER sync_username_display_name
    BEFORE INSERT OR UPDATE ON users
    FOR EACH ROW
    EXECUTE FUNCTION sync_user_names();

阶段 3:回填
  -- 分批回填历史数据
  UPDATE users SET display_name = username
  WHERE display_name IS NULL AND id BETWEEN ? AND ?;

阶段 4:切换读
  -- 应用代码改读 display_name
  -- 持续观察一段时间(一周)

阶段 5:Contract(清理)
  -- 移除触发器
  DROP TRIGGER sync_username_display_name ON users;
  -- 应用停写 username
  -- 删除旧列
  ALTER TABLE users DROP COLUMN username;

标准迁移阶段

1. 现状确认
   □ 表大小(行数 + 占空间)
   □ 写入频率(QPS)
   □ 依赖服务(哪些应用读 / 写)
   □ 备份状态(最近备份时间 + 已验证恢复)
   □ 复制拓扑(主从延迟 / 半同步)
   ↓
2. 兼容变更(Expand)
   □ 新增字段 / 表 / 索引
   □ 不破坏旧代码
   □ 默认 NULL 或安全默认值
   ↓
3. 回填
   □ 分批
   □ 限速
   □ 幂等(可重试)
   □ 可观测进度
   □ 可暂停
   ↓
4. 双读 / 双写或灰度切换
   □ 验证新旧数据一致
   □ 监控错误率
   □ 灰度比例:5% / 50% / 100%
   ↓
5. 清理(Contract)
   □ 删除旧字段 / 旧索引 / 旧逻辑
   □ 至少灰度全量后等 1 周
   ↓
6. 回滚和复盘
   □ 记录风险与经验

危险 DDL 操作清单

PostgreSQL

操作锁级别锁表?替代方案
ADD COLUMN(NULL)ACCESS EXCLUSIVE极短安全
ADD COLUMN ... DEFAULT(PG 11+ 常量)ACCESS EXCLUSIVE极短安全
ADD COLUMN NOT NULL DEFAULT ?ACCESS EXCLUSIVE极短(PG 11+)旧版需多步
ALTER COLUMN TYPEACCESS EXCLUSIVE重写整表加新列 + 双写 + 删旧
ADD CONSTRAINT NOT NULLACCESS EXCLUSIVE全表扫NOT VALID + VALIDATE
ADD FOREIGN KEYSHARE ROW EXCLUSIVE长NOT VALID + VALIDATE
CREATE INDEXSHARE阻塞写CONCURRENTLY
DROP TABLE / DROP COLUMNACCESS EXCLUSIVE短安全
RENAME COLUMNACCESS EXCLUSIVE短Expand/Contract

MySQL

操作InnoDB Online DDL?替代方案
ADD COLUMN(5.6+)✅ INPLACE安全
DROP COLUMN(5.6+)✅ INPLACE安全
ALTER COLUMN TYPE(兼容)✅ INPLACE / 8.0 INSTANT多数 OK
ALTER COLUMN TYPE(不兼容)❌ COPYgh-ost / pt-osc
ADD INDEX(5.6+)✅ INPLACE安全
RENAME INDEX(5.7+)✅ INSTANT安全
OPTIMIZE TABLE❌ COPY(5.6 前)gh-ost

迁移计划表

阶段操作SQL前置条件验证方式回滚方式负责人预计耗时
1 兼容变更新增 nullable 字段ALTER TABLE orders ADD ...备份完成schema 检查删除字段(无写入时)DBE5 分钟
2 双写部署新代码-阶段 1 完成监控错误率回滚部署Dev10 分钟
3 回填分批 UPDATE见脚本阶段 2 稳定 24hCOUNT 校验不回滚(幂等)DBE2 小时
4 切换读部署读新列代码-阶段 3 完成业务监控回滚部署Dev10 分钟
5 等观察------1 周
6 清理删旧列ALTER TABLE ... DROP COLUMN阶段 5 无问题schema 检查备份恢复DBE5 分钟

大表迁移工具

PostgreSQL

1. CREATE INDEX CONCURRENTLY
   - 不锁表
   - 失败留 INVALID 索引

2. pg_repack
   - 在线重整表(消除膨胀)
   - 触发器 + 副本

3. 内置:ADD COLUMN ... DEFAULT 常量(PG 11+)
   - 不重写表
   - 元数据级

MySQL

1. gh-ost(GitHub 出品)
   - 无触发器
   - 复制历史写入到影子表
   - 主从一致

2. pt-online-schema-change(Percona)
   - 触发器 + 影子表
   - 较老但稳定

3. 内置 ALTER TABLE ... ALGORITHM=INPLACE
   - 5.6+ 大部分 ALTER 已在线

回填策略

分批回填

-- 错:一次性回填,锁表
UPDATE orders SET source = 'unknown' WHERE source IS NULL;

-- 对:分批 + 限速
DO $$
DECLARE
  batch_size INT := 1000;
  rows_updated INT;
BEGIN
  LOOP
    UPDATE orders SET source = 'unknown'
    WHERE id IN (
      SELECT id FROM orders WHERE source IS NULL LIMIT batch_size
    );
    GET DIAGNOSTICS rows_updated = ROW_COUNT;
    EXIT WHEN rows_updated = 0;
    PERFORM pg_sleep(0.1);  -- 限速
  END LOOP;
END $$;

进度可观测

-- 单独表跟踪进度
CREATE TABLE migration_progress (
  job_name varchar PRIMARY KEY,
  total_rows bigint,
  processed_rows bigint DEFAULT 0,
  status varchar DEFAULT 'running',
  started_at timestamptz DEFAULT now(),
  updated_at timestamptz DEFAULT now()
);

幂等性

-- 必须可重跑
UPDATE orders SET status = 'pending'
WHERE status IS NULL  -- 幂等条件
  AND id BETWEEN ? AND ?;

回滚方案设计

三层回滚

代码回滚(最快):
  应用回滚到上一版本
  耗时:5~10 分钟
  适用:代码 Bug,schema 兼容时

Schema 回滚(次之):
  执行反向 DDL(DROP COLUMN / DROP INDEX)
  耗时:5~30 分钟
  适用:schema 错误

数据回滚(最慢):
  从备份恢复(point-in-time recovery)
  耗时:1 小时 ~ 数小时
  适用:数据损坏 / 删错数据

回滚检查表

□ 回滚触发条件清晰(错误率 > X% / P99 > Y)
□ 回滚步骤可执行
□ 回滚执行人和窗口
□ 回滚后验证方式
□ 数据恢复路径(备份 + 复制)
□ 客户沟通模板(如需)

不可逆操作(必须备份)

DROP TABLE / DROP COLUMN
DELETE / TRUNCATE 大表
DROP INDEX(重建慢)
ALTER COLUMN TYPE(精度丢失)
迁移到不兼容数据库

灰度策略

Phase 1:金丝雀(5%)
  - 1 个节点 / 1 个租户 / 1% 用户
  - 持续 1 小时~1 天
  - 监控核心指标

Phase 2:扩大(50%)
  - 多节点 / 多租户 / 50% 用户
  - 持续 1~3 天
  - 业务方确认

Phase 3:全量(100%)
  - 全部
  - 持续 1 周观察
  - 进入清理阶段

配套模板

  • templates/migration-plan-template.md — 完整迁移计划(背景 + 阶段表 + 验证 + 回滚 + 风险 + 待确认)
  • templates/rollback-checklist-template.md — 回滚清单(触发条件 / 步骤 / 验证 / 沟通)

质量自检

□ 区分空库迁移和生产存量迁移
□ 评估锁表、长事务、磁盘、复制延迟
□ 有备份点和恢复验证
□ 回填分批、幂等、可重试、可暂停
□ 进度可观测
□ 灰度、监控、回滚条件清晰
□ 与后端发布顺序明确
□ 标注不可逆操作
□ 回滚永远可执行
□ 大表用 CONCURRENTLY / Online DDL / gh-ost
□ Expand/Contract 模式(重命名 / 类型变更)
□ 至少 1 周观察期再 Contract

常见坑

  1. 大表 NOT NULL DEFAULT 锁表——PG 旧版本会重写整表(PG 11+ 已修复)
  2. 先删字段再发代码——旧版本服务崩溃
  3. 回填脚本不可重复执行——失败后无法恢复
  4. 没检查复制延迟——主从延迟到分钟级
  5. 没监控磁盘——回填到一半磁盘满
  6. 回滚方案只写"回滚代码"——没有数据恢复路径
  7. CREATE INDEX 不用 CONCURRENTLY——PG 锁写
  8. MySQL 跑 gh-ost 不留 buffer——磁盘满
  9. 灰度跳过——直接全量上线
  10. 不可逆操作未备份——删错列无法恢复
  11. 没观察期就 Contract——刚切完就删旧列,回滚困难
  12. 触发器拷贝数据没限速——主从延迟爆炸
  13. 应用代码强依赖新 schema——schema 失败时应用挂
  14. Migration 脚本不进版本控制——团队各自跑各自的

与其他 skill 的协作

上游:
  schema-design → DDL 来源
  index-access-pattern → 索引变更来源

下游:
  data-operations-safety → 生产操作门禁
  backend-engineer → 应用代码同步发布
  devops-engineer → 部署窗口、CI/CD
  sre-ops → 监控、告警、复制延迟、磁盘
  qa-engineer → 迁移验证用例

相关参考

  • references/migration-rollout-guide.md — Expand/Contract 模式深度、gh-ost / pg_repack 实战、回填限速策略、灰度发布、复制延迟监控

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

A/B 测试设计与分析时使用。适用于产品实验、功能验证、转化率优化。融合假设驱动 + 样本量计算 + 置信度判断。

日本語の概要は準備中です。原文の説明を表示しています。

zhaoxuya520/AI-Fullstack-Delivery-Workflow532026年5月19日 更新

上线前业务方/产品方验收时使用。适用于功能交付确认、UAT、发布会签。融合 BDD Given-When-Then、Specification by Example、ATDD。

日本語の概要は準備中です。原文の説明を表示しています。

zhaoxuya520/AI-Fullstack-Delivery-Workflow532026年5月19日 更新

设计无障碍可访问的界面时使用。适用于满足 WCAG 标准、键盘导航、屏幕阅读器支持。优先使用 WCAG 2.2 AA 级标准 + 键盘 + 焦点 + 对比度 + ARIA。

日本語の概要は準備中です。原文の説明を表示しています。

zhaoxuya520/AI-Fullstack-Delivery-Workflow532026年5月19日 更新

实现可访问性(无障碍)时使用。覆盖 WCAG 2.2 AA / ARIA / 键盘导航 / 屏幕阅读器 / 颜色对比 / 焦点管理。融合 React Aria / Radix UI / Headless UI 实践 + axe-core 自动化测试。

日本語の概要は準備中です。原文の説明を表示しています。

zhaoxuya520/AI-Fullstack-Delivery-Workflow532026年5月19日 更新

AI 模型部署时使用。适用于推理服务 / GPU / TensorRT / 监控 / 扩缩容。

日本語の概要は準備中です。原文の説明を表示しています。

zhaoxuya520/AI-Fullstack-Delivery-Workflow532026年5月19日 更新

数据分析报告输出时使用。适用于业务分析报告、周报、专项分析、决策支持。融合洞察 + 建议 + 行动项。

日本語の概要は準備中です。原文の説明を表示しています。

zhaoxuya520/AI-Fullstack-Delivery-Workflow532026年5月19日 更新

zhaoxuya520 のスキルをすべて見る

このスキルの問題を報告する