[Epic] Admin 迁移到线上 MySQL 8.4 #76

Open
opened 2026-08-10 01:07:44 +08:00 by ila · 2 comments
Owner

背景与目标

Admin 当前使用本机 SQLite,适合单机便携运行,但采购员、Client 和顺运宝数据需要集中共享。线上服务器已经运行 MySQL 8.4.8(仅监听 127.0.0.1:3307),最终目标是把 Admin 部署到同一服务器并以该实例作为唯一生产数据库。

目标:

  1. 将 Admin 的生产数据完整迁移到线上 MySQL 8.4.8。
  2. 生产 Admin 与 MySQL 同机或位于私有网络,不开放公网数据库端口。
  3. 保持 Client 四接口、任务幂等、领取并发和“不可逆后只核单”安全规则。
  4. 迁移期间保留原 SQLite 文件作为只读回退,验收后移除运行时 SQLite 支持。
  5. 提供可重复演练、可核对、失败不破坏源库的一次性迁移工具。

非目标

  • 不做 SQLite/MySQL 双写或自动同步。
  • 不允许生产环境在两种数据库间随意切换。
  • 不开放 MySQL 3307 到公网。
  • 不在本 Epic 开启真实采购或自动付款。
  • 不把数据库或服务器密码写入仓库、日志、工单、归档或数据库。

总体方案与关键决策

  • 生产���据库固定为 MySQL 8.4;字符集使用 utf8mb4,连接会话固定 UTC。
  • Admin 最终部署到线上服务器,通过 127.0.0.1:3307 连接。
  • 使用 Go database/sql 和纯 Go MySQL 驱动;驱动版本必须兼容 Go 1.23。
  • MySQL 使用独立最小权限账号和独立数据库,凭据只从环境变量或仓库外配置读取。
  • 新建 MySQL 专用迁移表,迁移只追加;MySQL DDL 按单条原子且可重放执行,整版全部完成并通过 schema 自检后才记录版本,不复用 SQLite PRAGMA user_version。
  • repository SQL、事务领取和 schema 检查按 MySQL 8 语义实现,并用真实 MySQL 8 测试。
  • SQLite → MySQL 为单向迁移:先校验目标为空,再按外键顺序导入,最后逐表数量和关键业务不变量核对。
  • 切换前冻结写入并备份 SQLite;失败时停止新 Admin、恢复旧版本和原 SQLite,不做反向覆盖。

阶段路线

  1. 更新技术基线、配置边界和 MySQL 连接/迁移骨架。
  2. 将 repository SQL、事务和测试迁移到 MySQL 8 语义。
  3. 实现 SQLite 到 MySQL 的只读迁移与核对工具。
  4. 在线上 MySQL 8.4 演练、部署 Admin、切换并执行回归。
  5. 稳定验收后移除 Admin 运行时 SQLite 支持,保留迁移工具和只读备份。

子工单清单

  • #77 [MVP] Admin MySQL 8.4 单一生产数据库
    • #78 Admin:建立 MySQL 8 配置、连接与迁移基线
    • #79 Admin:迁移 Repository SQL 与并发事务到 MySQL 8
    • #80 Admin:实现 SQLite 到 MySQL 8 单向迁移与核对
    • #81 Admin:部署线上 MySQL 8 并完成生产切换

依赖与全局风险

  • MySQL 8.4 实例当前仅本机可达,开发机测试需要 SSH 隧道或服务器内执行。
  • SQLite 和 MySQL 的 upsert、部分唯一索引、JSON、大小写排序和事务锁语义不同。
  • 任务领取若没有行锁和条件更新保护,可能被两个 Client 同时领取。
  • 数据迁移遗漏人工 PDD 关联、SKU 映射、账号或 Session 会影响采购闭环。
  • 切换期间若新旧 Admin 同时写入会产生分叉,必须设置单写冻结窗口。
  • 新依赖许可证需项目负责人确认后才能发布。

回退策略

  • 迁移工具只读源 SQLite,任何失败都不修改源文件。
  • 上线前复制并校验 SQLite 备份。
  • 切换失败时停止 MySQL 版 Admin,恢复旧 Admin 与原 SQLite;MySQL 目标库保留供排查,不回写 SQLite。
  • 迁移成功后也不立即删除 SQLite,至少保留到用户完成生产验收。

最终验收标准

  • Admin 生产进程使用线上 MySQL 8.4.8,MySQL 端口未对公网开放。

  • SQLite 全部业务数据迁移完成,逐表数量和关键业务关系核对一致。

  • Client 四接口契约、任务领取并发、幂等提交、顺运宝同步、登录权限全部回归通过。

  • 同一待领任务并���请���只允许一个 Client 成功领取。

  • 迁移失败和部署失败均完成一次可���作回退演练。

  • 生产配置和日志不包含数据库、服务器、Cookie 或业务账号密码。

  • Admin 运行时不再依赖 SQLite;原 SQLite 只作为只读备份和迁移来源。

  • #83 Admin:允许从 config.yaml 读取 MySQL 8 配置

  • #85 Admin:为固定公网 IP 开放 MySQL 8 白名单直连

  • #86 Admin:支持校验 CA 的 MySQL 公网 TLS 连接

  • #128 Admin:重新打包并增量部署最新版本到生产服务器

  • #129 允许所有公网 IP 连接生产 MySQL 业务账号

## 背景与目标 Admin 当前使用本机 SQLite,适合单机便携运行,但采购员、Client 和顺运宝数据需要集中共享。线上服务器已经运行 MySQL 8.4.8(仅监听 127.0.0.1:3307),最终目标是把 Admin 部署到同一服务器并以该实例作为唯一生产数据库。 目标: 1. 将 Admin 的生产数据完整迁移到线上 MySQL 8.4.8。 2. 生产 Admin 与 MySQL 同机或位于私有网络,不开放公网数据库端口。 3. 保持 Client 四接口、任务幂等、领取并发和“不可逆后只核单”安全规则。 4. 迁移期间保留原 SQLite 文件作为只读回退,验收后移除运行时 SQLite 支持。 5. 提供可重复演练、可核对、失败不破坏源库的一次性迁移工具。 ## 非目标 - 不做 SQLite/MySQL 双写或自动同步。 - 不允许生产环境在两种数据库间随意切换。 - 不开放 MySQL 3307 到公网。 - 不在本 Epic 开启真实采购或自动付款。 - 不把数据库或服务器密码写入仓库、日志、工单、归档或数据库。 ## 总体方案与关键决策 - 生产���据库固定为 MySQL 8.4;字符集使用 utf8mb4,连接会话固定 UTC。 - Admin 最终部署到线上服务器,通过 127.0.0.1:3307 连接。 - 使用 Go `database/sql` 和纯 Go MySQL 驱动;驱动版本必须兼容 Go 1.23。 - MySQL 使用独立最小权限账号和独立数据库,凭据只从环境变量或仓库外配置读取。 - 新建 MySQL 专用迁移表,迁移只追加;MySQL DDL 按单条原子且可重放执行,整版全部完成并通过 schema 自检后才记录版本,不复用 SQLite `PRAGMA user_version`。 - repository SQL、事务领取和 schema 检查按 MySQL 8 语义实现,并用真实 MySQL 8 测试。 - SQLite → MySQL 为单向迁移:先校验目标为空,再按外键顺序导入,最后逐表数量和关键业务不变量核对。 - 切换前冻结写入并备份 SQLite;失败时停止新 Admin、恢复旧版本和原 SQLite,不做反向覆盖。 ## 阶段路线 1. 更新技术基线、配置边界和 MySQL 连接/迁移骨架。 2. 将 repository SQL、事务和测试迁移到 MySQL 8 语义。 3. 实现 SQLite 到 MySQL 的只读迁移与核对工具。 4. 在线上 MySQL 8.4 演练、部署 Admin、切换并执行回归。 5. 稳定验收后移除 Admin 运行时 SQLite 支持,保留迁移工具和只读备份。 ## 子工单清单 - [ ] #77 [MVP] Admin MySQL 8.4 单一生产数据库 - [x] #78 Admin:建立 MySQL 8 配置、连接与迁移基线 - [x] #79 Admin:迁移 Repository SQL 与并发事务到 MySQL 8 - [x] #80 Admin:实现 SQLite 到 MySQL 8 单向迁移与核对 - [x] #81 Admin:部署线上 MySQL 8 并完成生产切换 ## 依赖与全局风险 - MySQL 8.4 实例当前仅本机可达,开发机测试需要 SSH 隧道或服务器内执行。 - SQLite 和 MySQL 的 upsert、部分唯一索引、JSON、大小写排序和事务锁语义不同。 - 任务领取若没有行锁和条件更新保护,可能被两个 Client 同时领取。 - 数据迁移遗漏人工 PDD 关联、SKU 映射、账号或 Session 会影响采购闭环。 - 切换期间若新旧 Admin 同时写入会产生分叉,必须设置单写冻结窗口。 - 新依赖许可证需项目负责人确认后才能发布。 ## 回退策略 - 迁移工具只读源 SQLite,任何失败都不修改源文件。 - 上线前复制并校验 SQLite 备份。 - 切换失败时停止 MySQL 版 Admin,恢复旧 Admin 与原 SQLite;MySQL 目标库保留供排查,不回写 SQLite。 - 迁移成功后也不立即删除 SQLite,至少保留到用户完成生产验收。 ## 最终验收标准 - Admin 生产进程使用线上 MySQL 8.4.8,MySQL 端口未对公网开放。 - SQLite 全部业务数据迁移完成,逐表数量和关键业务关系核对一致。 - Client 四接口契约、任务领取并发、幂等提交、顺运宝同步、登录权限全部回归通过。 - 同一待领任务并���请���只允许一个 Client 成功领取。 - 迁移失败和部署失败均完成一次可���作回退演练。 - 生产配置和日志不包含数据库、服务器、Cookie 或业务账号密码。 - Admin 运行时不再依赖 SQLite;原 SQLite 只作为只读备份和迁移来源。 - [x] #83 Admin:允许从 config.yaml 读取 MySQL 8 配置 - [x] #85 Admin:为固定公网 IP 开放 MySQL 8 白名单直连 - [x] #86 Admin:支持校验 CA 的 MySQL 公网 TLS 连接 - [x] #128 Admin:重新打包并增量部署最新版本到生产服务器 - [x] #129 允许所有公网 IP 连接生产 MySQL 业务账号
Author
Owner

用户已批量验收通过 Admin 工单:#78、#79、#80、#81、#83、#85、#86。对应子工单已关闭,父工单清单已同步;父工单本身是否满足整体关闭条件仍按其全部范围单独判断。

用户已批量验收通过 Admin 工单:#78、#79、#80、#81、#83、#85、#86。对应子工单已关闭,父工单清单已同步;父工单本身是否满足整体关闭条件仍按其全部范围单独判断。
Author
Owner

生产部署与公网连接验收同步(2026-08-11)

用户明确验收通过 #128、#129。两项本地归档状态已更新,验收记录提交为 6386d76,对应工单均已关闭并在本父工单中标记完成。

父工单仍有其他范围,因此保持打开。

## 生产部署与公网连接验收同步(2026-08-11) 用户明确验收通过 #128、#129。两项本地归档状态已更新,验收记录提交为 `6386d76`,对应工单均已关闭并在本父工单中标记完成。 父工单仍有其他范围,因此保持打开。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#76