Files
cmautobuy/docs/task/78-mysql8数据库基础.md
T

55 lines
3.0 KiB
Markdown
Raw Normal View History

2026-08-10 01:22:50 +08:00
# 78 Admin:建立 MySQL 8 配置、连接与迁移基线
- 类型:重构
- 父级大工单:#76
- 所属 MVP / 版本:#77
- 状态:已完成,待用户验收
- 日期:2026-08-10
- Gitea 工单:<http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/78>
## 背景与目标
Admin 原来只支持 SQLite。本任务先建立 MySQL 8.4 的安全连接、版本化 schema 和技术基线,不切换生产业务 SQL,也不修改原 `admin.db`。
## 最终方案
- 生产驱动固定 `go-sql-driver/mysql` v1.9.2,兼容 Go 1.23;许可证为 MPL-2.0,发布仍需项目负责人确认。
- 数据库密码只从环境变量读取;配置的字符串表示自动打码。
- 默认连接同机 `127.0.0.1:3307`,连接会话固定 UTC、utf8mb4、严格 SQL mode,并设置超时和有限连接池。
- 启动连接检查 MySQL 8 主版本、目标库、会话时区和字符集。
- MySQL 使用独立 `schema_migrations`;考虑 DDL 隐式提交,语句可重放,全部完成并通过 schema 自检后才记录版本。
- 当前 SQLite v8 的最终结构已建立为 MySQL schema v1;当前客户端归属唯一性用生成列加唯一索引表达。
- 真实集成测试必须显式开启,且库名必须以 `_test` 结尾,防止清理生产库。
- 历史 SQLite 驱动只保留给单向迁移工具和旧库回归,不再作为最终生产运行时。
## 改了哪些
- `admin/config/config.go`、`config_test.go`:MySQL 环境变量配置、默认地址和密码打码测试。
- `admin/repository/mysql_db.go`:连接池、运行参数检查、MySQL schema v1、迁移和 schema 自检。
- `admin/repository/mysql_db_integration_test.go`:受 `_test` 库名门禁保护的真实 MySQL 8 集成测试。
- `admin/go.mod`、`go.sum`:固定 MySQL 驱动 v1.9.2。
- `admin/AGENTS.md` 与 `docs/admin/00~03/06`:更新最终 MySQL-only 生产决策、迁移期边界和测试门禁。
## 验收结果
| 验收标准 | 结果 |
|---|---|
| 固定 Go 1.23 构建 MySQL 驱动并记录版本/许可证 | 通过 |
| DSN 来源安全且错误/字符串不泄露密码 | 通过 |
| 空 MySQL 8.4 建立完整 schema,重复执行无副作用 | 通过(真实 8.4.8) |
| 版本、UTC、utf8mb4、表和关键列自检 | 通过 |
| 基线明确 MySQL-only、不双写、不开放公网端口 | 通过 |
| SQLite 仍可用于后续只读迁移和历史回归 | 通过 |
## 测试
- 执行的命令:
- `$env:GOTOOLCHAIN='go1.23.0'; go build ./...; go test ./... -count=1; go vet ./...; go mod verify`
- 通过 SSH 隧道对服务器 `/tmp/cmautobuy-mysql8-test-78` 的隔离 MySQL 8.4.8 实例运行 `TestMySQLMigrate_真实MySQL8`。
- 结果:固定 Go 1.23 全量构建、测试、静态检查和模块校验通过;MySQL schema 首次迁移及重复迁移通过。
- **没验证到的部分**:尚未获得线上 3307 实例的 MySQL 管理账号,因此未创建生产数据库/账号;生产切换属于 #81。隔离临时实例保留到后续 MySQL repository 和迁移工具测试完成后统一删除。
## 相关提交
- `7e74bf2` 建立 MySQL 8 数据库基础