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

103 lines
4.5 KiB
Markdown
Raw Normal View History

# 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 时执行 |
---
*检查说明:按上述顺序与条件执行,可避免重复加列报错与误删区域数据。*