Admin:建立 MySQL 8 配置、连接与迁移基线 #78

Closed
opened 2026-08-10 01:09:13 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:重构
  • 父级大工单:#76
  • 所属 MVP / 版本:#77
  • 阶段:1 数据库基础

要解决什么

Admin 的技术基线、启动配置和 schema migrations 全部固定为 SQLite,无法安全连接 MySQL 8.4,也没有 MySQL 版本表、连接池或启动自检。

做什么 / 不做什么

  • 做:更新 AGENTS 和 Admin 基线;引入兼容 Go 1.23 的纯 Go MySQL 驱动;从环境变量/仓库外配置读取 DSN;建立 MySQL 8 schema migrations、连接池、UTC/utf8mb4 和版本自检。
  • 不做:本工单不迁移业务 repository SQL、不迁移真实数据、不部署生产、不删除 SQLite 迁移工具依赖。

怎么做

  • 固定 github.com/go-sql-driver/mysql@v1.9.2(Go 1.21+,兼容项目 Go 1.23;MPL-2.0)。
  • 新增 MySQL 连接配置对象,禁止在错误、日志或页面打印完整 DSN。
  • MySQL schema 使用独立的 schema_migrations 表和追加式版本;DDL 使用可重放语句逐条执行,全部完成并通过严格 schema 自检后才记录版本,以适应 MySQL DDL 隐式提交。所有表、索引、约束按当前 v8 最终结构建立。
  • 使用 utf8mb4、UTC、严格 SQL mode;配置连接/读写超时和有限连接池。
  • 启动时核对 MySQL 主版本、当前数据库、表和关键列,不匹配则拒绝启动。
  • 更新 admin/AGENTS.md、上手、架构、数据模型和质量门禁,明确最终 MySQL-only 生产决策与迁移期边界。

预计修改:admin/AGENTS.md、admin/go.mod、admin/go.sum、admin/config/、admin/repository/db*.go、admin/main.go、docs/admin/00~03/06 及测试。

验收标准

  • 固定 Go 1.23 能构建 MySQL 驱动,依赖版本和许可证已记录。
  • DSN 只从环境变量或仓库外配置读取,错误信息不泄露密码。
  • 空 MySQL 8.4 测试库能原子建立完整 schema,重复执行无副作用。
  • MySQL 版本、UTC、utf8mb4、表和关键列启动自检通过;不兼容时拒绝启动。
  • 基线文档不再声明生产数据库固定 SQLite,并明确不双写、不开放公网端口。
  • 现有 SQLite 代码在迁移期仍可用于只读迁移与回退测试。

怎么验证

GOTOOLCHAIN=go1.23.0 go build/test/vet ./...;在隔离 MySQL 8.4 数据库执行迁移两次并核对 schema。

风险和回退

新增驱动和基线错误会阻断启动;本工单不切换生产。回退提交即可恢复 SQLite 启动路径,现有 admin.db 不变。

## 基本信息 - 类型:重构 - 父级大工单:#76 - 所属 MVP / 版本:#77 - 阶段:1 数据库基础 ## 要解决什么 Admin 的技术基线、启动配置和 schema migrations 全部固定为 SQLite,无法安全连接 MySQL 8.4,也没有 MySQL 版本表、连接池或启动自检。 ## 做什么 / 不做什么 - 做:更新 AGENTS 和 Admin 基线;引入兼容 Go 1.23 的纯 Go MySQL 驱动;从环境变量/仓库外配置读取 DSN;建立 MySQL 8 schema migrations、连接池、UTC/utf8mb4 和版本自检。 - 不做:本工单不迁移业务 repository SQL、不迁移真实数据、不部署生产、不删除 SQLite 迁移工具依赖。 ## 怎么做 - 固定 `github.com/go-sql-driver/mysql@v1.9.2`(Go 1.21+,兼容项目 Go 1.23;MPL-2.0)。 - 新增 MySQL 连接配置对象,禁止在错误、日志或页面打印完整 DSN。 - MySQL schema 使用独立的 `schema_migrations` 表和追加式版本;DDL 使用可重放语句逐条执行,全部完成并通过严格 schema 自检后才记录版本,以适应 MySQL DDL 隐式提交。所有表、索引、约束按当前 v8 最终结构建立。 - 使用 utf8mb4、UTC、严格 SQL mode;配置连接/读写超时和有限连接池。 - 启动时核对 MySQL 主版本、当前数据库、表和关键列,不匹配则拒绝启动。 - 更新 `admin/AGENTS.md`、上手、架构、数据模型和质量门禁,明确最终 MySQL-only 生产决策与迁移期边界。 预计修改:`admin/AGENTS.md`、`admin/go.mod`、`admin/go.sum`、`admin/config/`、`admin/repository/db*.go`、`admin/main.go`、`docs/admin/00~03/06` 及测试。 ## 验收标准 - [x] 固定 Go 1.23 能构建 MySQL 驱动,依赖版本和许可证已记录。 - [x] DSN 只从环境变量或仓库外配置读取,错误信息不泄露密码。 - [x] 空 MySQL 8.4 测试库能原子建立完整 schema,重复执行无副作用。 - [x] MySQL 版本、UTC、utf8mb4、表和关键列启动自检通过;不兼容时拒绝启动。 - [x] 基线文档不再声明生产数据库固定 SQLite,并明确不双写、不开放公网端口。 - [x] 现有 SQLite 代码在迁移期仍可用于只读迁移与回退测试。 ## 怎么验证 `GOTOOLCHAIN=go1.23.0 go build/test/vet ./...`;在隔离 MySQL 8.4 数据库执行迁移两次并核对 schema。 ## 风险和回退 新增驱动和基线错误会阻断启动;本工单不切换生产。回退提交即可恢复 SQLite 启动路径,现有 admin.db 不变。
Author
Owner

实施前只读审计补充:线上 MySQL 8.4.8 已承载 cmhub,服务为 mysql84、监听 127.0.0.1:3307,数据目录 /mysql84_data,磁盘当前约 88%。cmautobuy 必须使用独立库和最小权限账号;#81 上线前增加容量与备份检查。MySQL 多条 DDL 不能用普通事务整体回滚,迁移方案已改为单条原子、可重放、最后记版本并严格自检。未读取或记录任何现有应用密码。

实施前只读审计补充:线上 MySQL 8.4.8 已承载 cmhub,服务为 mysql84、监听 127.0.0.1:3307,数据目录 /mysql84_data,磁盘当前约 88%。cmautobuy 必须使用独立库和最小权限账号;#81 上线前增加容量与备份检查。MySQL 多条 DDL 不能用普通事务整体回滚,迁移方案已改为单条原子、可重放、最后记版本并严格自检。未读取或记录任何现有应用密码。
Author
Owner

完成记录

  • 实现提交:7e74bf2
  • 归档提交:05793e4
  • 归档:docs/task/78-mysql8数据库基础.md
  • 固定 Go 1.23 build/test/vet/mod verify 全部通过。
  • 隔离 MySQL 8.4.8 上首次迁移、重复迁移和 schema 自检通过。
  • 未修改生产 3307 数据;未读取或记录现有应用密码。

工单保持开放等待用户验收;继续实施依赖工单 #79。

## 完成记录 - 实现提交:`7e74bf2` - 归档提交:`05793e4` - 归档:`docs/task/78-mysql8数据库基础.md` - 固定 Go 1.23 build/test/vet/mod verify 全部通过。 - 隔离 MySQL 8.4.8 上首次迁移、重复迁移和 schema 自检通过。 - 未修改生产 3307 数据;未读取或记录现有应用密码。 工单保持开放等待用户验收;继续实施依赖工单 #79。
Author
Owner

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

用户已明确验收通过。验收清单已回填,本工单关闭。
ila closed this issue 2026-08-10 23:22:57 +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#78