Admin:实现 SQLite 到 MySQL 8 单向迁移与核对 #80

Closed
opened 2026-08-10 01:09:15 +08:00 by ila · 1 comment
Owner

基本信息

  • 类型:需求
  • 父级大工单:#76
  • 所属 MVP / 版本:#77
  • 阶段:3 数据迁移

要解决什么

历史业务数据在 admin.db 中,必须完整迁移到 MySQL 8,并能证明人工 PDD 关联、SKU 映射、任务、账号和同步进度没有遗漏。

做什么 / 不做什么

  • 做:实现只读源 SQLite、只写空目标 MySQL 的一次性迁移命令;逐表计数和关键关系核对;生成不含敏感数据的摘要。
  • 不做:不双写、不增量同步、不覆盖非空目标库、不迁移明文配置文件和日志中的凭据。

怎么做

  • 迁移前检查 SQLite schema v8、执行一致性检查并记录只读摘要。
  • 检查 MySQL 目标 schema 版本正确且业务表为空。
  • 按外键依赖顺序分批导入全部业务表,事务失败整体回滚。
  • 保留主键、UTC 时间字符串、JSON 原文、密码哈希和 Session 哈希;不生成或修改业务状态。
  • 核对逐表数量、孤儿关联、当前归属唯一、活动任务重复、PDD 关联和同步游标。
  • 提供 --dry-run/仅核对模式;输出只含表���、数量和错误类型。

预计修改:admin/cmd/migrate-sqlite-to-mysql/、repository 导出/导入辅助、测试和操作文档。

验收标准

  • 迁移命令以只读方式打开 SQLite,失败不修改源文件。
  • 非空 MySQL 目标默认拒绝,不能误覆盖生产数据。
  • v8 全表数据迁移后逐表数量一致。
  • 人工 PDD 关联、SKU 映射、账号、客户端归属、任务/领取历史、幂等记录和同步游标一致。
  • 重复运行不会重复导入;需要重新演练时必须显式使用新的空测试库。
  • 输出、错误和文档不包含密码、Cookie、Session 原文或业务明细。
  • 提供可复制的演练、核对和失败处理命令。

怎么验证

使用脱敏 SQLite fixture 迁移到隔离 MySQL 8.4;模拟目标非空、源版本错误、外键冲突和中途失败。

风险和回退

迁移遗漏会影响采购闭环。源库始终只读;目标失败则丢弃隔离测试库重新演练,不对 SQLite 反向写入。

实施记录

  • 新增一次性迁移命令,必须显式选择 --dry-run、--execute 或 --verify-only。
  • SQLite 使用 mode=ro 与 query_only 双重只读;检查 v8、quick_check 和外键。
  • MySQL 非空目标拒绝;15 张业务表在单事务中按依赖顺序导入。
  • 迁移后比较逐表数量和全部迁移列的 SHA-256 摘要,并核对关键关系。
  • 数据库原始错误不直接输出,避免主键或业务明细进入终端和工单。
  • 实现提交:c296fea。

测试结果

  • 脱敏 v8 fixture 在隔离 MySQL 8.4 上通过演练、正式迁移、重复拒绝、错误版本和中途失败整体回滚。
  • 当前 25 MB admin.db 在隔离 MySQL 8.4 完成 15 表约 1.67 万行迁移;自动核对和独立 --verify-only 均通过,源文件 SHA-256 前后不变。
  • Go 1.23.0:go build ./...、go test ./...、go vet ./... 均通过。
  • 未连接或修改线上生产 MySQL。
## 基本信息 - 类型:需求 - 父级大工单:#76 - 所属 MVP / 版本:#77 - 阶段:3 数据迁移 ## 要解决什么 历史业务数据在 admin.db 中,必须完整迁移到 MySQL 8,并能证明人工 PDD 关联、SKU 映射、任务、账号和同步进度没有遗漏。 ## 做什么 / 不做什么 - 做:实现只读源 SQLite、只写空目标 MySQL 的一次性迁移命令;逐表计数和关键关系核对;生成不含敏感数据的摘要。 - 不做:不双写、不增量同步、不覆盖非空目标库、不迁移明文配置文件和日志中的凭据。 ## 怎么做 - 迁移前检查 SQLite schema v8、执行一致性检查并记录只读摘要。 - 检查 MySQL 目标 schema 版本正确且业务表为空。 - 按外键依赖顺序分批导入全部业务表,事务失败整体回滚。 - 保留主键、UTC 时间字符串、JSON 原文、密码哈希和 Session 哈希;不生成或修改业务状态。 - 核对逐表数量、孤儿关联、当前归属唯一、活动任务重复、PDD 关联和同步游标。 - 提供 `--dry-run`/仅核对模式;输出只含表���、数量和错误类型。 预计修改:`admin/cmd/migrate-sqlite-to-mysql/`、repository 导出/导入辅助、测试和操作文档。 ## 验收标准 - [x] 迁移命令以只读方式打开 SQLite,失败不修改源文件。 - [x] 非空 MySQL 目标默认拒绝,不能误覆盖生产数据。 - [x] v8 全表数据迁移后逐表数量一致。 - [x] 人工 PDD 关联、SKU 映射、账号、客户端归属、任务/领取历史、幂等记录和同步游标一致。 - [x] 重复运行不会重复导入;需要重新演练时必须显式使用新的空测试库。 - [x] 输出、错误和文档不包含密码、Cookie、Session 原文或业务明细。 - [x] 提供可复制的演练、核对和失败处理命令。 ## 怎么验证 使用脱敏 SQLite fixture 迁移到隔离 MySQL 8.4;模拟目标非空、源版本错误、外键冲突和中途失败。 ## 风险和回退 迁移遗漏会影响采购闭环。源库始终只读;目标失败则丢弃隔离测试库重新演练,不对 SQLite 反向写入。 ## 实施记录 - 新增一次性迁移命令,必须显式选择 --dry-run、--execute 或 --verify-only。 - SQLite 使用 mode=ro 与 query_only 双重只读;检查 v8、quick_check 和外键。 - MySQL 非空目标拒绝;15 张业务表在单事务中按依赖顺序导入。 - 迁移后比较逐表数量和全部迁移列的 SHA-256 摘要,并核对关键关系。 - 数据库原始错误不直接输出,避免主键或业务明细进入终端和工单。 - 实现提交:c296fea。 ## 测试结果 - 脱敏 v8 fixture 在隔离 MySQL 8.4 上通过演练、正式迁移、重复拒绝、错误版本和中途失败整体回滚。 - 当前 25 MB admin.db 在隔离 MySQL 8.4 完成 15 表约 1.67 万行迁移;自动核对和独立 --verify-only 均通过,源文件 SHA-256 前后不变。 - Go 1.23.0:go build ./...、go test ./...、go vet ./... 均通过。 - 未连接或修改线上生产 MySQL。
Author
Owner

用户已明确验收通过。验收清单已回填,本工单关闭。

用户已明确验收通过。验收清单已回填,本工单关闭。
ila closed this issue 2026-08-10 23:23:06 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#80