pangu-user-platform/docs/发布计划_PROD_SQL脚本变更检查.md

103 lines
4.5 KiB
Markdown
Raw 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.

# PROD 发布 - SQL 脚本变更检查
**检查日期**: 2026-02-05
**目标**: 部署前确认 PROD 库需执行的增量脚本及执行顺序
---
## 一、本次发布涉及的 SQL 脚本scripts/sql/
| 序号 | 脚本文件 | 说明 | 涉及表 | 风险 | 是否幂等 |
|------|----------|------|--------|------|----------|
| 1 | V1.0.3__open_api_dict.sql | 开放API接口字典数据 | pg_api_dict | 低 | 是ON DUPLICATE KEY UPDATE |
| 2 | V1.0.4__grade_add_stage.sql | 年级表增加学段字段 | pg_grade | 中 | 否(重复执行会报错:列已存在) |
| 3 | V1.0.5__clean_region_data.sql | 清理非湖北省区域数据 | pg_region | 高 | 否(物理删除,不可逆) |
---
## 二、各脚本变更内容摘要
### V1.0.3__open_api_dict.sql
- **操作类型**: INSERT存在则 UPDATE
- **变更内容**:
- 学生OPEN_STUDENT_LIST、OPEN_STUDENT_LIST_FULL2 条)
- 学校OPEN_SCHOOL_LIST、OPEN_SCHOOL_LIST_ALL、OPEN_SCHOOL_INFO3 条)
- 年级OPEN_GRADE_LIST、OPEN_GRADE_LIST_ALL、OPEN_GRADE_INFO3 条)
- 班级OPEN_CLASS_LIST、OPEN_CLASS_LIST_ALL、OPEN_CLASS_INFO3 条)
- **共 11 条** pg_api_dict 记录
- **执行前**: 确认 PROD 存在表 `pg_api_dict`,且主键/唯一约束与脚本一致api_id 或 api_code
- **重复执行**: 安全,仅更新名称/路径/描述
### V1.0.4__grade_add_stage.sql
- **操作类型**: ALTER TABLE + UPDATE
- **变更内容**:
1. `ALTER TABLE pg_grade ADD COLUMN stage CHAR(1) NULL COMMENT '学段1小学 2初中 3高中 4中专 5大学' AFTER grade_name;`
2. 按年级名称回填:小学(1)/初中(2)/高中(3),未匹配默认小学(1)
3. `ALTER TABLE pg_grade MODIFY COLUMN stage ... NOT NULL DEFAULT '1';`
- **执行前**: 必须确认 PROD 的 `pg_grade` **没有** `stage` 列,否则跳过或先判断列是否存在
- **重复执行**: 会报错(列已存在),需做存在性检查或仅执行一次
### V1.0.5__clean_region_data.sql
- **操作类型**: 物理 DELETE
- **变更内容**:
- 删除所有「非湖北省及其下级」的区域ancestors 不以 `0,42` 开头,且 region_id≠42
- 再删除其他省份根节点parent_id=0 且 region_id≠42
- **执行前**: 必须备份 `pg_region`;确认湖北省 region_id=42建议业务低峰期、单独审批后执行
- **重复执行**: 可执行(已删的不会再删),但不可逆
---
## 三、PROD 执行前必做检查
1. **确认表是否存在**
- `pg_api_dict`、`pg_grade`、`pg_region` 在 PROD 是否存在且结构一致。
2. **确认是否已执行过**
- **V1.0.4**:在 PROD 执行
`SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pg_grade' AND COLUMN_NAME='stage';`
- 若结果为 1说明已有 `stage`**不要**再执行 V1.0.4。
- **V1.0.3**:可重复执行,无需跳过。
3. **V1.0.5 是否在本次执行**
- 若 PROD 需保留多省数据,**不要**执行 V1.0.5。
- 若只保留湖北省,执行前必须备份:
`mysqldump -h <PROD库> -u<> -p pguser-db pg_region > pg_region_backup_YYYYMMDD.sql`
4. **会员区域字段(本次 H5 会员区域功能依赖)**
- 若 PROD 的 `pg_member` 表是早期建表、**没有** `region_id` 列,需先执行增量加列(见下节),再发布应用与 H5。
---
## 四、可选pg_member.region_id 增量脚本
若 PROD 的 `pg_member` 尚无 `region_id` 列,需在应用发布前执行(仅执行一次):
```sql
-- 检查是否已有列(结果为 0 表示需要执行下面的 ADD
-- SELECT COUNT(*) FROM information_schema.COLUMNS
-- WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pg_member' AND COLUMN_NAME='region_id';
ALTER TABLE pg_member
ADD COLUMN region_id bigint DEFAULT NULL COMMENT '区域ID' AFTER open_id;
```
建议将上述内容保存为 `scripts/sql/V1.0.2__member_region_id.sql`(或 V1.0.6,按你们版本号规范),并在发布计划中注明执行顺序:在 V1.0.3 之前或之后均可(与 pg_grade、pg_region 无依赖)。
---
## 五、推荐执行顺序PROD
| 顺序 | 脚本 | 条件 |
|------|------|------|
| 1 | V1.0.2__member_region_id.sql若有 | 仅当 pg_member 无 region_id 时执行 |
| 2 | V1.0.3__open_api_dict.sql | 必执行 |
| 3 | V1.0.4__grade_add_stage.sql | 仅当 pg_grade 无 stage 列时执行 |
| 4 | V1.0.5__clean_region_data.sql | 仅当确定只保留湖北省且已备份 pg_region 时执行 |
---
*检查说明:按上述顺序与条件执行,可避免重复加列报错与误删区域数据。*