# Flyway 迁移脚本部署说明

## 正式环境部署指南

### 1. Flyway 配置确认

生产环境配置 `application-prod.yml` 已正确设置：

```yaml
spring:
  flyway:
    enabled: true              # ✅ 必须设置为 true
    locations: classpath:db/migration
    clean-disabled: true       # ✅ 禁止清理数据库
    validate-on-migrate: true  # ✅ 迁移前验证
    skip-patterns: V7_,V8_,V10_,V43_  # ✅ 跳过测试数据脚本
```

### 2. 测试数据脚本处理

生产环境通过 `skip-patterns` 配置跳过以下测试数据脚本：

| 脚本文件 | 内容 | 状态 |
|---------|------|------|
| `V7__add_test_data.sql` | 测试课程、套餐、教师、家长、学生数据 | ⚠️ 生产环境跳过 |
| `V8__add_tenant_package_test_data.sql` | 测试租户套餐数据 | ⚠️ 生产环境跳过 |
| `V10__add_relation_test_data.sql` | 测试关联数据（课程资源、活动、任务等） | ⚠️ 生产环境跳过 |
| `V43__add_student_class_history_data.sql` | 测试学生班级关联数据 | ⚠️ 生产环境跳过 |

**注意**：
- 开发和测试环境**不受影响**，会继续执行所有脚本
- 生产环境通过 `skip-patterns` 配置自动跳过带 `V7_`、`V8_`、`V10_`、`V43_` 前缀的脚本

### 3. 正式环境迁移执行顺序

Flyway 将按以下顺序执行迁移脚本（生产环境跳过 V7, V8, V10, V43）：

```
V1 → V2 → V3 → V4 → V5 → V6 → V9 → V11 → V12 → V13 → V14 → V15 → V16
→ V26 → V27 → V28 → V29 → V31 → V32 → V33 → V34 → V35 → V36 → V37
→ V38 → V39 → V40 → V41 → V42 → V44 → V45 → V46 → V47 → V48 → V49 → V50
```

**跳过的脚本**：V7, V8, V10, V43（测试数据）

### 4. 部署步骤

#### 步骤 1：准备数据库

```sql
-- 创建数据库（如未创建）
CREATE DATABASE IF NOT EXISTS `lesingle-edu-reading-platform`
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

-- 创建数据库用户（推荐使用专用用户）
CREATE USER 'reading_platform'@'%' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON `lesingle-edu-reading-platform`.* TO 'reading_platform'@'%';
FLUSH PRIVILEGES;
```

#### 步骤 2：配置环境变量

```bash
# 数据库配置
export DB_HOST=你的数据库主机
export DB_PORT=3306
export DB_USERNAME=reading_platform
export DB_PASSWORD=强密码

# Redis 配置
export REDIS_HOST=你的 Redis 主机
export REDIS_PORT=6379

# JWT 密钥（必须设置）
export JWT_SECRET=你的 JWT 密钥（建议 32 位以上随机字符串）

# OSS 配置（可选，使用默认值或设置）
export OSS_ENDPOINT=oss-cn-shenzhen.aliyuncs.com
export OSS_ACCESS_KEY_ID=你的 AccessKey
export OSS_ACCESS_KEY_SECRET=你的 AccessKey 密钥
export OSS_BUCKET_NAME=lesingle-kid-course
```

#### 步骤 3：启动应用

```bash
# 使用生产环境配置启动
java -jar reading-platform.jar --spring.profiles.active=prod
```

#### 步骤 4：验证迁移

启动后检查日志，确认 Flyway 迁移成功：

```
Flyway migration completed successfully
Applied X migrations to database
```

检查数据库中的迁移历史表：

```sql
USE `lesingle-edu-reading-platform`;
SELECT * FROM flyway_schema_history ORDER BY installed_rank;
```

### 5. 初始化超管账号

迁移完成后，数据库中没有超管账号，需要通过超管端创建第一个超管账号。

### 6. 注意事项

1. **测试数据脚本跳过** - 生产环境通过 `skip-patterns` 配置跳过 V7, V8, V10, V43
2. **开发和测试环境不受影响** - 其他环境继续执行所有脚本（包括测试数据）
3. **JWT 密钥必须设置** - 生产环境必须通过环境变量设置 JWT_SECRET
4. **数据库权限最小化** - 建议使用专用数据库用户，仅授予必要权限
5. **备份数据库** - 部署前建议备份数据库
6. **Flyway 历史记录** - `flyway_schema_history` 表记录了所有迁移历史，不要手动修改

### 7. 迁移脚本清单

| 版本号 | 脚本文件 | 描述 |
| --- | --- | --- |
| V1 | `V1__init_schema.sql` | 初始化基础表结构 |
| V2 | `V2__add_course_tables.sql` | 添加课程相关表 |
| V3 | `V3__add_business_tables.sql` | 添加业务表 |
| V4 | `V4__add_resource_tables.sql` | 添加资源表 |
| V5 | `V5__fix_password.sql` | 修复密码字段 |
| V6 | `V6__fix_status.sql` | 修复状态字段 |
| V9 | `V9__fix_resource_and_tenant_tables.sql` | 修复资源和租户表 |
| V11-V16 | `V11-V16__*.sql` | 自增 ID、字段修复 |
| V26-V29 | `V26-V29__*.sql` | 添加集体课型、排课引用数据等 |
| V31-V35 | `V31-V35__*.sql` | 删除废弃字段、套餐结构重构 |
| V36-V42 | `V36-V42__*.sql` | 重命名表、清理旧表、优化关联表 |
| V44-V50 | `V44-V50__*.sql` | 添加阅读任务功能、主题色、操作日志扩展 |

---

**最后更新**: 2026-03-25
**适用版本**: 生产环境部署
