本地 IDC 异构数据映射迁移
背景
将指定 MySQL dump 的基础表和数据恢复到独立 utf8mb4 中转库,再按字段映射写入本地开发库 idc 的既有最终结构。目标 idc 不允许执行任何 DDL。
范围与验收
- [ ] 先完成可恢复的全量备份和迁移前结构快照。
- [ ] 中转库仅恢复基础表和数据;跳过 dump 中的视图、触发器、事件和例程。
- [ ] 生成字段差异矩阵、可复用 JSON 映射和 INSERT SELECT 脚本。
- [ ] 目标端只执行允许的 DML 与会话级外键设置。
- [ ] 完成结构、行数、核心字段哈希、外键和 Laravel 冒烟验收。
实施步骤
- 备份 idc,记录 SHOW CREATE TABLE 指纹。
- 创建唯一的 idc_temp_restore 中转库并恢复经过对象过滤的 dump。
- 分析元数据,生成并审阅映射配置。
- 在外键检查关闭期间按映射清空和导入目标数据;失败时以数据备份回滚。
- 运行结构与数据验收,记录输出和遗留风险。
风险与回滚
- 风险:异构字段、唯一键、旧日期值、分类层级和外键引用可造成导入不一致。
- 结构保护: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-22 | dump 的 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-22 | app:serve HTTP 冒烟后停止其完整进程树,并重做一次 DML 导入。 | 该命令会启动 queue worker,消费历史 jobs;最终验收须在 worker 停止且数据重新映射后执行,避免运行态副作用污染行数。 |
