A/B 测试设计与分析时使用。适用于产品实验、功能验证、转化率优化。融合假设驱动 + 样本量计算 + 置信度判断。
日本語の概要は準備中です。原文の説明を表示しています。
设计数据库迁移、回填、灰度切换和回滚方案时使用。适用于生产表结构变更、大表迁移、数据修复和上线前评审。融合 Strangler Pattern + Expand/Contract + 双写校验 + 在线 DDL。
インストールする前に、エージェントに与えられる指示の中身を確認できます。
参考来源: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. 回滚永远可执行
不可逆操作必须有数据备份
目标:把 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. 回滚和复盘
□ 记录风险与经验
| 操作 | 锁级别 | 锁表? | 替代方案 |
|---|---|---|---|
ADD COLUMN(NULL) | ACCESS EXCLUSIVE | 极短 | 安全 |
ADD COLUMN ... DEFAULT(PG 11+ 常量) | ACCESS EXCLUSIVE | 极短 | 安全 |
ADD COLUMN NOT NULL DEFAULT ? | ACCESS EXCLUSIVE | 极短(PG 11+) | 旧版需多步 |
ALTER COLUMN TYPE | ACCESS EXCLUSIVE | 重写整表 | 加新列 + 双写 + 删旧 |
ADD CONSTRAINT NOT NULL | ACCESS EXCLUSIVE | 全表扫 | NOT VALID + VALIDATE |
ADD FOREIGN KEY | SHARE ROW EXCLUSIVE | 长 | NOT VALID + VALIDATE |
CREATE INDEX | SHARE | 阻塞写 | CONCURRENTLY |
DROP TABLE / DROP COLUMN | ACCESS EXCLUSIVE | 短 | 安全 |
RENAME COLUMN | ACCESS EXCLUSIVE | 短 | Expand/Contract |
| 操作 | InnoDB Online DDL? | 替代方案 |
|---|---|---|
ADD COLUMN(5.6+) | ✅ INPLACE | 安全 |
DROP COLUMN(5.6+) | ✅ INPLACE | 安全 |
ALTER COLUMN TYPE(兼容) | ✅ INPLACE / 8.0 INSTANT | 多数 OK |
ALTER COLUMN TYPE(不兼容) | ❌ COPY | gh-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 检查 | 删除字段(无写入时) | DBE | 5 分钟 |
| 2 双写 | 部署新代码 | - | 阶段 1 完成 | 监控错误率 | 回滚部署 | Dev | 10 分钟 |
| 3 回填 | 分批 UPDATE | 见脚本 | 阶段 2 稳定 24h | COUNT 校验 | 不回滚(幂等) | DBE | 2 小时 |
| 4 切换读 | 部署读新列代码 | - | 阶段 3 完成 | 业务监控 | 回滚部署 | Dev | 10 分钟 |
| 5 等观察 | - | - | - | - | - | - | 1 周 |
| 6 清理 | 删旧列 | ALTER TABLE ... DROP COLUMN | 阶段 5 无问题 | schema 检查 | 备份恢复 | DBE | 5 分钟 |
1. CREATE INDEX CONCURRENTLY
- 不锁表
- 失败留 INVALID 索引
2. pg_repack
- 在线重整表(消除膨胀)
- 触发器 + 副本
3. 内置:ADD COLUMN ... DEFAULT 常量(PG 11+)
- 不重写表
- 元数据级
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
上游:
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 测试设计与分析时使用。适用于产品实验、功能验证、转化率优化。融合假设驱动 + 样本量计算 + 置信度判断。
日本語の概要は準備中です。原文の説明を表示しています。
上线前业务方/产品方验收时使用。适用于功能交付确认、UAT、发布会签。融合 BDD Given-When-Then、Specification by Example、ATDD。
日本語の概要は準備中です。原文の説明を表示しています。
设计无障碍可访问的界面时使用。适用于满足 WCAG 标准、键盘导航、屏幕阅读器支持。优先使用 WCAG 2.2 AA 级标准 + 键盘 + 焦点 + 对比度 + ARIA。
日本語の概要は準備中です。原文の説明を表示しています。
实现可访问性(无障碍)时使用。覆盖 WCAG 2.2 AA / ARIA / 键盘导航 / 屏幕阅读器 / 颜色对比 / 焦点管理。融合 React Aria / Radix UI / Headless UI 实践 + axe-core 自动化测试。
日本語の概要は準備中です。原文の説明を表示しています。
AI 模型部署时使用。适用于推理服务 / GPU / TensorRT / 监控 / 扩缩容。
日本語の概要は準備中です。原文の説明を表示しています。
数据分析报告输出时使用。适用于业务分析报告、周报、专项分析、决策支持。融合洞察 + 建议 + 行动项。
日本語の概要は準備中です。原文の説明を表示しています。