Skip to content

本地 IDC 异构数据映射迁移

背景

将指定 MySQL dump 的基础表和数据恢复到独立 utf8mb4 中转库,再按字段映射写入本地开发库 idc 的既有最终结构。目标 idc 不允许执行任何 DDL。

范围与验收

  • [ ] 先完成可恢复的全量备份和迁移前结构快照。
  • [ ] 中转库仅恢复基础表和数据;跳过 dump 中的视图、触发器、事件和例程。
  • [ ] 生成字段差异矩阵、可复用 JSON 映射和 INSERT SELECT 脚本。
  • [ ] 目标端只执行允许的 DML 与会话级外键设置。
  • [ ] 完成结构、行数、核心字段哈希、外键和 Laravel 冒烟验收。

实施步骤

  1. 备份 idc,记录 SHOW CREATE TABLE 指纹。
  2. 创建唯一的 idc_temp_restore 中转库并恢复经过对象过滤的 dump。
  3. 分析元数据,生成并审阅映射配置。
  4. 在外键检查关闭期间按映射清空和导入目标数据;失败时以数据备份回滚。
  5. 运行结构与数据验收,记录输出和遗留风险。

风险与回滚

  • 风险:异构字段、唯一键、旧日期值、分类层级和外键引用可造成导入不一致。
  • 结构保护:idc 禁止 CREATE、ALTER、DROP、TRUNCATE;自增只自然推进并校验。
  • 回滚:仅用阶段一的数据备份和目标 DML 恢复;任何映射未定义错误连续三表即停止并触发回滚。

进度

  • [x] 工作规则、迁移流程和现有实现已审阅。
  • [x] 阶段一备份与中转恢复(批次 20260722_213601;备份哈希已复核)。
  • [x] 阶段二矩阵和映射预检(批次 20260722_213601)。
  • [x] 阶段三数据迁移:批次 20260722_224316 的 62 个映射计划均成功,目标端仅执行受控 DML 与会话级外键开关。
  • [x] 阶段四验收和产物归档:结构、行数、核心 MD5、外键、分类层级、Artisan 财务查询与 HTTP 冒烟均通过。

决策日志

日期决策原因
2026-07-22使用独立新 helper,不调用旧 reset 或直写迁移入口。旧入口会重建或直接覆盖目标数据,不能保证本任务的结构红线和可审计映射。
2026-07-22目标清空固定使用 DELETE。MySQL TRUNCATE 属于 DDL,与 idc 的零结构变更红线冲突。
2026-07-22dump 的 6 个视图区段整体过滤。视图区段包含同名分类表的 DROP TABLE,恢复会破坏中转和违反对象范围。
2026-07-22批次 20260722_213601 未保留导入数据,并已自动 DML 回滚。旧校验把高于最大 ID 的现有自增值误判为失败;在禁用 ALTER TABLE 的前提下只能保证下一值安全大于最大 ID,不能向下重置计数器。
2026-07-22使用新批次 20260722_224316 从阶段一重做,不续跑旧 state。新备份、中转库、矩阵和校验结果必须同源;成功批次结构差异为零。
2026-07-22对 3 条源端不可修复的非空外键孤儿子记录显式过滤。两条 product_upstream_bindings 与一条 supplier_plugin_bindings 均无法安全重关联父记录;规则写入可复用映射配置,最终外键校验为零孤儿。
2026-07-22app:serve HTTP 冒烟后停止其完整进程树,并重做一次 DML 导入。该命令会启动 queue worker,消费历史 jobs;最终验收须在 worker 停止且数据重新映射后执行,避免运行态副作用污染行数。

基于 AGPL-3.0-or-later 发布