Files
orbit/docs/reports/phase-6-fresh-install.md

2.3 KiB
Raw Blame History

P6 无外键新装基线验证

验证日期:2026-09-20。此次补齐的是数据库初始化边界:历史迁移文件保持不可变,已有库仍从原账本前向升级;空库由迁移器直接执行当前版本基线,再登记 1–28 的迁移名称和校验和。基线不包含 FOREIGN KEY、REFERENCES、迁移账本表或固定 DEFINER,因此新库初始化不会先创建历史外键。

实现

  • 迁移入口 在取得数据库级迁移锁后区分空库和已有 Orbit 表;存在业务表但没有账本,或账本为空而已有业务表时拒绝猜测历史。
  • 无外键基线 由当前 v28 最终结构生成,保留表、索引、唯一约束、CHECK、生成列和不可变触发器;不包含外键、引用约束或客户端 DELIMITER 脚本。
  • 基线执行前把所有历史版本写成 dirty=true,全部 DDL 成功后统一清除脏标记。中断会阻断后续迁移,必须由运维核对实际结构后处理,不能自动跳过。
  • 无外键单元检查 禁止基线重新出现引用 DDL,并要求基线版本和迁移末版本一致。

实际验证

场景 结果 证据
空 MySQL 8.4 数据库执行 orbit-migrate up PASS TestIntegrationFreshInstallUsesNoForeignKeys,迁移账本 28 条、information_schema.REFERENTIAL_CONSTRAINTS 为 0、CheckSchema 通过
v7 历史库升级到当前版本 PASS TestIntegrationNoForeignKeysUpgrade,历史 70 条外键删除为 0,323 个既有索引组件和任务数据保留,手工外键漂移被拒绝
CLI 结构核验 PASS orbit-admin verify 输出 schema_version=28、migration_count=28、foreign_key_count=0、complete=true

验证命令使用 Docker golang:1.25 临时工具链和 MySQL 8.4 一次性容器;不是 Go 1.27.1 标准全量回归,也不代表复制、切换、RPO/RTO 或生产拓扑验收。

运维边界

升级旧库仍必须停用不兼容写节点,在维护窗口执行正式迁移并随后运行 orbit-admin verify。新装基线只解决初始化阶段的外键约束问题,不会替代应用事务中的命名空间、资源归属和权限校验;数据库关联字段仍由服务端显式核对。