6.2 KiB
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首次执行时发生脚本语法中断。在此诚实记录该故障的发生根因与修复过程:
首次失败原因:
- 当前 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表达式。事实定性:
- 经独立只读深度核验确认,真实数据库表结构、约束定义、数据映射与索引等本身 100% 正确无误,未受任何影响。
修复与复测:
- 严格遵循变更纪律,严禁修改数据库任何表结构、约束、索引与数据,严禁重跑 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 已彻底删除:
train_accommodationtrain_class_plantrain_class_reporttrain_classroom_infotrain_coursetrain_course_resourcetrain_dorm_authtrain_dormitory_infotrain_electronic_boardtrain_enrollmenttrain_lessontrain_plan_coursetrain_resourcetrain_score_itemtrain_studenttrain_student_checkintrain_student_portraittrain_student_scoretrain_study_durationtrain_teachertrain_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: 1sys_menu: 106sys_dept: 15sys_dict_type: 44sys_dict_data: 500 (系统底层零破坏、零改动,007 字典脚本保持未执行状态)
四、最终结论
RailwaySystem 数据库 V2 迁移各阶段正式执行完毕,通过 010_verify.sql 定义级深度验收与全量只读独立审计,满足全部准出标准。数据库正式进入 V2 生产基线状态。