Files
railwaysystem/docs/database-v2/11_final_migration_validation.md
T

6.2 KiB

RailwaySystem 数据库 V2 最终迁移验收报告 (010_verify PASS)

本文档记录 RailwaySystem 数据库 V2 迁移从双门禁、备份、结构演进、数据迁移、表下线至最终全量定义级验收的完整审计结果。


一、迁移全周期通过矩阵

迁移阶段 对应执行脚本 / 门禁 执行状态 事务结果 核心验收结论
Gate A 000_tx_capability_probe.sql PASS 显式回滚成功 证实 KingbaseES 实例支持 DDL 事务原子性回滚
Gate B 000_preflight.sql PASS 只读通过 确认精确处于 Phase 0.5 起点 (14旧表, 1教师, 13空表)
Stage 1 001_backup_current_schema.sql PASS COMMIT 生成 14 张 bak_v1_* 快照,教师唯一真实数据封存
Stage 2 002_create_new_tables.sql PASS COMMIT 建立 8 张 V2 新业务表,行数均为 0
Stage 3 003_alter_master_tables.sql PASS COMMIT 8 张主数据表结构完成解耦改造,卸载旧触发器
Stage 4 004_rebuild_business_tables.sql PASS COMMIT 重建 5 张业务过程表,对齐新领域核心外键与列模型
Stage 5 005_constraints.sql PASS COMMIT 建立 13 组 UNIQUE, 26 组 FK (全 NO ACTION), 9 组 CHECK
Stage 6 006_indexes.sql PASS COMMIT 建立 3 组排课冲突时间复合索引、部分唯一索引及外键索引
Stage 7 008_migrate_teacher.sql PASS COMMIT 教师数据无缝映射迁移,固化 NOT NULL,安全清理旧列
Stage 8 009_drop_legacy_score.sql PASS COMMIT 0 行旧成绩表 train_score_info 安全下线淘汰
Stage 9 010_verify.sql PASS 完整通过 21 表定义级深度验收全量 PASS,输出 [Verify-PASS]

二、010 验收脚本工程审计与兼容性修复复盘

Important

关键工程审计记录: 本次迁移过程中,010_verify.sql 首次执行时发生脚本语法中断。在此诚实记录该故障的发生根因与修复过程:

  1. 首次失败原因:

    • 当前 KingbaseES 实例配置为 database_mode = mysql 兼容模式。
    • 原 010_verify.sql 第 117 行包含动态 SQL 拼接语句:EXECUTE 'SELECT count(*) FROM ' || r.tbl INTO v_cnt;。
    • 在 MySQL 模式下,双竖线 || 被数据库引擎解析为**逻辑或(Logical OR)**运算符而非字符串拼接。因此 'SELECT count(*) FROM ' || r.tbl 在求值时被隐式转为布尔逻辑运算,计算结果为 false(字符 'f'),随后的 EXECUTE 'f' 抛出语法异常 ERROR: syntax error at or near "f"。
    • 同时,原脚本在 actual_unique 中未限定 uq_%,将 Phase 0.5 遗留的旧 uk_* 约束误判为 UNEXPECTED_UQ;并在索引定义断言中未包含 Kingbase 自动展开的 NULLS FIRST 表达式。
  2. 事实定性:

    • 经独立只读深度核验确认,真实数据库表结构、约束定义、数据映射与索引等本身 100% 正确无误,未受任何影响。
  3. 修复与复测:

    • 严格遵循变更纪律,严禁修改数据库任何表结构、约束、索引与数据,严禁重跑 001~009。
    • 仅对 010_verify.sql 进行语法与元数据兼容性修复:
      • 动态 SQL 改用安全标识符函数:EXECUTE format('SELECT count(*) FROM public.%I', r.tbl) INTO v_cnt;
      • 差异文本拼接改用 concat(...) 替代 ||
      • 唯一约束断言精确聚焦 V2 的 uq_% 命名规范
      • 索引断言兼容匹配 Kingbase 引擎生成的 NULLS FIRST 格式
    • 重新提交 010 脚本并单独重测,010_verify.sql 顺利执行完毕并完全通过,输出 [Verify-PASS]。

三、最终数据库状态全量审计矩阵

3.1 正式业务表集合 (精确 21 张)

train_* 表总数精确为 21 张,train_score_info 已彻底删除:

  1. train_accommodation
  2. train_class_plan
  3. train_class_report
  4. train_classroom_info
  5. train_course
  6. train_course_resource
  7. train_dorm_auth
  8. train_dormitory_info
  9. train_electronic_board
  10. train_enrollment
  11. train_lesson
  12. train_plan_course
  13. train_resource
  14. train_score_item
  15. train_student
  16. train_student_checkin
  17. train_student_portrait
  18. train_student_score
  19. train_study_duration
  20. train_teacher
  21. train_training_site

3.2 备份表集合 (精确 14 张)

14 张 bak_v1_* 表全部完好保留,未发生任何变更或误删。

3.3 业务数据行数

  • train_teacher: 精确 1 行(org_name 已填充,status=1 NOT NULL, del_flag='0' NOT NULL,旧字段已彻底清理)。
  • 其余 20 张正式业务表: 全部精确为 0 行。

3.4 约束体系

  • 13 组 UNIQUE: 13/13 全部建立成功,定义与所属列完全匹配。
  • 26 组 FK: 26/26 全部建立成功,删除规则严格均为 ON DELETE NO ACTION,禁止级联。
  • 9 组 CHECK: 9/9 关键检查约束全部就绪并通过逻辑验证。
  • 12 个 Identity: 12 张业务表的自增主键全部保持系统自增特性。

3.5 索引体系

  • 排课 3 组时间冲突复合索引定义正确:
    • idx_lesson_teacher_time: (t_id, start_time, end_time)
    • idx_lesson_classroom_time: (class_room_id, start_time, end_time)
    • idx_lesson_site_time: (site_id, start_time, end_time)
  • 部分唯一索引定义正确:
    • uq_idx_study_source_event: (source_system, source_event_id) WHERE source_system IS NOT NULL AND source_event_id IS NOT NULL

3.6 默认值规则

  • train_accommodation.accommodation_status: 严格默认值为 0 (预分配)。
  • 业务选择型字段(source_type, accommodation_required, venue_type, checkin_way, verify_result)全部无业务默认值。

3.7 系统底座 (sys_*) 基线

  • sys_user: 1
  • sys_menu: 106
  • sys_dept: 15
  • sys_dict_type: 44
  • sys_dict_data: 500 (系统底层零破坏、零改动,007 字典脚本保持未执行状态)

四、最终结论

RailwaySystem 数据库 V2 迁移各阶段正式执行完毕,通过 010_verify.sql 定义级深度验收与全量只读独立审计,满足全部准出标准。数据库正式进入 V2 生产基线状态。