migration-helperlisted
Install: claude install-skill afine907/skills
# Migration Helper — 数据迁移助手
设计安全的数据迁移方案,生成迁移脚本和校验逻辑。
## Goal
设计和执行数据迁移方案,包含迁移脚本生成、数据校验、回滚策略、灰度迁移计划
## Trigger
- 数据库表结构变更需要迁移
- 系统重构需要数据迁移
- 数据库切换(MySQL→PostgreSQL)
- 用户要求"数据迁移"、"表结构变更"
## 工作流程
```
变更分析 → 方案设计 → 脚本生成 → 校验逻辑 → 回滚方案 → 执行计划
```
## 迁移类型
| 类型 | 场景 | 风险 | 停机要求 |
|------|------|------|----------|
| DDL 变更 | 加字段、加索引 | 低 | 通常不需要 |
| 数据回填 | 填充新字段默认值 | 中 | 不需要 |
| 数据拆分 | 表拆分、分库分表 | 高 | 可能需要 |
| 数据合并 | 多表合并 | 高 | 可能需要 |
| 数据库切换 | MySQL→PostgreSQL | 极高 | 需要 |
## DDL 变更最佳实践
### 安全的 DDL 操作
```sql
-- ✅ 安全:加字段(带默认值)
ALTER TABLE users ADD COLUMN status TINYINT NOT NULL DEFAULT 0
COMMENT '用户状态: 0-正常, 1-禁用';
-- ✅ 安全:加索引(使用 CONCURRENTLY 避免锁表)
-- PostgreSQL
CREATE INDEX CONCURRENTLY idx_users_email ON users(email);
-- MySQL 8.0+
ALTER TABLE users ADD INDEX idx_users_email (email), ALGORITHM=INPLACE, LOCK=NONE;
-- ✅ 安全:加约束(先验证数据)
-- 1. 先检查是否有违反约束的数据
SELECT COUNT(*) FROM users WHERE email IS NULL;
-- 2. 修复违规数据
UPDATE users SET email = CONCAT('unknown_', id) WHERE email IS NULL;
-- 3. 再加约束
ALTER TABLE users MODIFY COLUMN email VARCHAR(255) NOT NULL;
```
### 危险的 DDL 操作
```sql
-- ❌ 危险:直接改列类型(可能丢数据)
ALTER TABLE users MODIFY COLUMN name VARCHAR(50);
-- ✅ 安全方式:
-- 1. 加新列
ALTER TABLE users ADD COLUMN name_new VARCHAR(50);
-- 2. 迁移数据
UPDATE users SET name_new = LEFT(name, 50);
-- 3. 切换列名
ALTER TABLE users DROP COLUMN name;
ALTER TABLE users CHANGE COLUMN name_new name VARCHAR(50);
```
## 迁移脚本模