diff --git a/docs/database-v2/09_stage1_backup_validation.md b/docs/database-v2/09_stage1_backup_validation.md new file mode 100644 index 000000000..5fad3dfdf --- /dev/null +++ b/docs/database-v2/09_stage1_backup_validation.md @@ -0,0 +1,107 @@ +# RailwaySystem 数据库 V2 Stage 1 备份阶段验证报告 + +本文档记录 RailwaySystem 数据库 V2 迁移 **Stage 1 (001_backup_current_schema.sql)** 在真实 KingbaseES 数据库环境中的执行与核验结果。 + +--- + +## 一、执行环境与基本参数 + +| 配置项 | 参数值 | 状态 | +| :--- | :--- | :--- | +| **执行时间** | 2026-09-14 02:30:18 CST | 已完成 | +| **数据库版本** | KingbaseES V009R003C018 | 正常 | +| **数据库实例** | `training` | 确认 | +| **当前 Schema** | `public` | 确认 | +| **会话 search_path** | `public, sys_catalog` | 确认 | +| **数据库模式** | `database_mode = mysql` | 确认 | +| **JDBC 驱动** | `com.kingbase8:kingbase8:8.6.0` (preferQueryMode=simple) | 官方原生驱动 | +| **执行脚本** | `RuoYi-Vue/sql/train/v2/001_backup_current_schema.sql` | 完整执行 | +| **事务状态** | `BEGIN ... COMMIT` | 完整提交 (COMMIT) | + +> [!IMPORTANT] +> **操作防重约束说明**: +> `001_backup_current_schema.sql` 已成功执行并提交。当前数据库已存在完整的 14 张 `bak_v1_*` 快照。根据脚本内建的强防重机制,除非数据库先完整回滚至 Phase 0.5 并清理当前备份状态,否则严禁再次执行 001 脚本,杜绝覆盖原始历史快照。 + +--- + +## 二、Stage 1 执行前置校验结果 + +在执行 001 之前,执行器执行了前置安全核验: +1. **既有备份表检查**: `SELECT count(*) FROM information_schema.tables WHERE table_schema = 'public' AND table_name LIKE 'bak_v1_%'` 计数为 **0**,无既有备份表。 +2. **基线数据行数检查**: `train_teacher` 精确为 **1** 行;其余 13 张旧业务表全部精确为 **0** 行。 +3. **核验判定**: 执行前检查全部通过,允许进入事务执行备份。 + +--- + +## 三、Stage 1 备份表生成与数据核验矩阵 + +### 3.1 备份表总数与完整清单 +- **备份表总数**: 精确 **14** 张(期望 14 张,无多余、无缺失)。 +- **14 张备份表完整字典序清单**: + 1. `bak_v1_train_class_plan` + 2. `bak_v1_train_class_report` + 3. `bak_v1_train_classroom_info` + 4. `bak_v1_train_course` + 5. `bak_v1_train_dorm_auth` + 6. `bak_v1_train_dormitory_info` + 7. `bak_v1_train_electronic_board` + 8. `bak_v1_train_score_info` + 9. `bak_v1_train_student` + 10. `bak_v1_train_student_checkin` + 11. `bak_v1_train_student_portrait` + 12. `bak_v1_train_study_duration` + 13. `bak_v1_train_teacher` + 14. `bak_v1_train_training_site` + +### 3.2 数据行数对照表 + +| 表名 (原表 / 备份表) | 原表行数 | 备份表行数 | 数据核验结论 | +| :--- | :--- | :--- | :--- | +| `train_teacher` / `bak_v1_train_teacher` | **1** | **1** | **PASS (真实教师数据安全封存)** | +| `train_student` / `bak_v1_train_student` | 0 | 0 | **PASS** | +| `train_course` / `bak_v1_train_course` | 0 | 0 | **PASS** | +| `train_class_plan` / `bak_v1_train_class_plan` | 0 | 0 | **PASS** | +| `train_dormitory_info` / `bak_v1_train_dormitory_info` | 0 | 0 | **PASS** | +| `train_dorm_auth` / `bak_v1_train_dorm_auth` | 0 | 0 | **PASS** | +| `train_classroom_info` / `bak_v1_train_classroom_info` | 0 | 0 | **PASS** | +| `train_training_site` / `bak_v1_train_training_site` | 0 | 0 | **PASS** | +| `train_class_report` / `bak_v1_train_class_report` | 0 | 0 | **PASS** | +| `train_electronic_board` / `bak_v1_train_electronic_board` | 0 | 0 | **PASS** | +| `train_student_checkin` / `bak_v1_train_student_checkin` | 0 | 0 | **PASS** | +| `train_score_info` / `bak_v1_train_score_info` | 0 | 0 | **PASS** | +| `train_study_duration` / `bak_v1_train_study_duration` | 0 | 0 | **PASS** | +| `train_student_portrait` / `bak_v1_train_student_portrait` | 0 | 0 | **PASS** | + +*(注:本报告严格遵循数据安全与脱敏规范,绝不记录教师姓名、身份证、联系方式等任何敏感个人信息)* + +--- + +## 四、未受影响对象与系统底座基线核验 + +### 4.1 V2 新增 8 表隔离检查 +在 Stage 1 完成后,8 张 V2 新建业务表依然全部不存在(count = 0),未提前创建: +- `train_resource`: 不存在 (PASS) +- `train_course_resource`: 不存在 (PASS) +- `train_plan_course`: 不存在 (PASS) +- `train_enrollment`: 不存在 (PASS) +- `train_lesson`: 不存在 (PASS) +- `train_accommodation`: 不存在 (PASS) +- `train_score_item`: 不存在 (PASS) +- `train_student_score`: 不存在 (PASS) + +### 4.2 若依系统底座表 (sys_*) 基线核验 +系统基础表在整个备份过程中零受损、零改动: +- `sys_user`: 1 行 (期望 1) +- `sys_menu`: 106 行 (期望 106) +- `sys_dept`: 15 行 (期望 15) +- `sys_dict_type`: 44 行 (期望 44) +- `sys_dict_data`: 500 行 (期望 500) + +--- + +## 五、Stage 1 阶段性结论 + +- **001 执行状态**: 成功完成并 COMMIT,脚本内部校验块通过,输出: + `[001-PASS] 14 张表快照备份全部完成,教师唯一真实数据已安全封存。` +- **Stage 1 最终判定**: **PASS**。 +- **后续迁移准备**: 满足 Stage 2 (`002_create_new_tables.sql`) 的前置准入条件。