记录双版本MySQL隔离迁移证据及剩余数据库门禁

This commit is contained in:
xuans 2026-09-27 18:54:56 +08:00
parent ee9ac857a9
commit 1d11dcfc6c
4 changed files with 66 additions and 9 deletions

View File

@ -39,7 +39,7 @@
| P0-02 | [x] | 建立完整任务清单 | 44 项逐项规格、原始编号名称、字段、六阶段、引用和汇总状态核对通过 | 等待最终复审,随实现同步状态和证据 | 四份规格、统一验收约定及 `fab98d1` 独立克隆 |
| P0-03 | [x] | 整理源码、构建产物和部署产物 | 全仓库及子目录规则、目录说明、正式回归和独立克隆构建校验通过 | 等待最终复审,后续提交继续执行边界检查 | 正式 Go 回归、完整索引、双平台 33 项清单及解包校验 |
| P0-04 | [~] | 统一开发和构建版本 | 精确工具链、安装策略、发布前后校验、系统清单及固定换行已实现,双独立克隆和完整自动化通过 | Linux 原生构建与双平台实际运行环境记录,不以交叉编译替代 | `94237b8`、175 项前端测试、后端完整回归、4 个 Web 文件一致、33 项清单和解包校验 |
| P0-05 | [!] | 确认数据库正式支持矩阵 | 三种数据库均有代码,但 README、文档和实机证据口径不完全一致 | 明确 SQLite、MySQL、PostgreSQL 的正式级别、版本和迁移回滚要求 | 三数据库迁移、备份恢复和连接测试 |
| P0-05 | [~] | 确认数据库正式支持矩阵 | 已修复迁移 BOM 阻塞,MySQL 5.7.44/8.0.45 各 48 项隔离实库迁移测试通过 | 补在线断线恢复、MySQL 备份恢复、PostgreSQL 当前复测及 SQLite 并发锁;正式服务验收仍缺 | `ee9ac85`、双版本严格 TLS、29 个重入边界、结构快照和冷重启持久化 |
| P0-06 | [~] | 建立统一领域模型 | 已有域名、证书、任务、服务器等实体,项目和部署关联仍需审查 | 补齐资源关系图、外键/归属和任务关联 | 模型文档、迁移检查、接口测试 |
| P0-07 | [~] | 增加项目级权限和资源隔离 | 用户组和角色已有实现,项目级资源边界未闭环 | 为证书、DNS、服务器、任务和审计补齐项目归属及越权测试 | 权限矩阵、接口越权测试 |
| P0-08 | [~] | 完善凭据和主密钥生命周期 | 已有凭据存储与测试,轮换、恢复、删除和失效证据不完整 | 补齐创建、轮换、恢复、删除、脱敏和不可恢复边界 | 安全测试、日志审查、恢复演练 |
@ -246,3 +246,33 @@ build/checkout-toolchain-lf-control-20260927/frontend/dist/
```
P0-04 保持 `[~] 进行中`;代码实现与自动化阶段标 `[x]`,Windows 隔离构建证据已齐,但 Linux 原生构建、双平台实际运行系统及最终复审未齐。不得据此宣称 44 项整改或生产部署验收完成。下一批继续 P0-05 的真实数据库版本、迁移与恢复矩阵;不清空现有共享 MySQL 服务中的业务库。
### 2026-09-27:P0-05 双版本 MySQL 隔离迁移与编码修复
本批北京时间约 18:39 开始,修改前检查点 `fd4929c`,代码候选 `ee9ac857a9855fd1993deb3b03498ca921a5b559`,均已推送。使用本机 MySQL 程序启动全新独立实例,没有连接、停止或清空原有 MySQL57/MySQL80 服务,没有 SSH、DNS、浏览器或生产部署操作;没有新增临时辅助脚本。
首次 MySQL 5.7.44 实测在第 7 号迁移报 1064。实际原因是嵌入 SQL 文件头存在 UTF-8 BOM,原解析器将其直接发给数据库,也使字段重入匹配失败。修复仅在解析入口去掉文件头编码标记,保留 SQL 字面量内部字符;没有批量改写迁移文件和中文。新增两项常规编码回归及正式隔离实库测试。
| 验证项 | 本批结果 | 证据边界 |
|---|---|---|
| MySQL 5.7.44 | `ee9ac85`:48 项子测试通过,0 失败、0 跳过;包测试约 29.8 秒 | Windows 本机独立真实数据库,不是远端生产实例 |
| MySQL 8.0.45 | 同候选:48 项子测试通过,0 失败、0 跳过;包测试约 42.8 秒 | 单独初始化与验证,没有以 5.7 代替 8.0 |
| 空库及历史升级 | 0~9 共 10 个起点,重复迁移无报错 | 历史结构由仓库旧迁移构造,不声称覆盖全部历史程序导出的生产库 |
| 迁移中断重入 | 9 份迁移共 29 个语句边界逐一落盘后重入,包括 DDL 全部执行但版本号未写入 | 模拟已落盘的中间状态,不是电源故障或操作系统崩溃演练 |
| 结构和数据 | 每条成功路径的表引擎、字符集、字段、默认值、索引与全新迁移快照一致;中文哨兵和用户、域名、服务器关联保留 | 不替代所有应用业务或权限 API 回归 |
| 连接安全 | 严格 TLS;不可信 CA、错误主机名、明文连接均被对应校验拒绝;业务账户无跨库及账户表权限 | 测试注册的 TLS 信任不等于正式配置、证书轮换及连接 UI 已验收 |
| 异常迁移历史 | 缺首项、缺中间项、零、负数和新版历史全部拒绝,保留数据、不创建业务表 | 不删除迁移记录绕过版本检查 |
| 冷重启 | 正常停止独立数据库,重新启动并重新打开应用连接后,数据和结构一致 | 不等于 Windows Service、systemd 或在线断线恢复验收 |
| 环境收尾 | 所有本测试启动的数据库已正常退出;原服务仍运行,进程号未变;随机监听已关闭,bootstrap 文件为空 | 数据目录和日志留在被忽略的产物目录,未删除既有文件或提交产物 |
| 常规回归 | 同候选 `go test -p 1 -count=1 -timeout=3m ./...`、`go vet -p=1 ./...`、`go mod verify` 全部通过 | 常规测试默认跳过外部实库门禁;MySQL 以本批两份显式运行日志为准,PostgreSQL 未启用;前端未改,本批未重跑前端 |
开发阶段曾在保留旧连接池后重启数据库,首次迁移收到 `invalid connection`。此项作为在线断线恢复待办保留,没有用自动重试掩盖 SQL 执行结果不确定性。最终冷重启用例明确关闭并重新打开应用连接,不将其算成该待办通过。TLS 反向测试也修正了错误码假设:账户的 `REQUIRE SSL` 可先返回认证拒绝,测试同时检查全局安全传输开关及严格证书错误类型,没有放宽加密要求。
正式命令在 `backend/` 执行,设置各版本独立的 `SCERT_MYSQL_TEST_BIN` 和共用产物根 `SCERT_MYSQL_TEST_ROOT`,然后运行 `go test -count=1 -v -timeout=8m -run '^TestMySQLRealMigrations$' ./internal/database`。每次运行自行新建数据目录与随机端口,完整参数见《构建版本与数据库支持矩阵.md》。最终非跳过日志:
```text
artifacts/mysql-matrix-20260927/mysql57-ee9ac85.log
artifacts/mysql-matrix-20260927/mysql80-ee9ac85.log
```
P0-05 从 `[!]` 调整为 `[~]`,并未标记完成;P0-04 剩余门禁和全部 44 项原始范围保持不变。下一步需继续处理在线数据库连接恢复、MySQL 备份恢复及完整业务初始化,再补 PostgreSQL 当前候选和 SQLite 并发锁证据。

View File

@ -61,16 +61,16 @@
## P0-05 确认数据库正式支持矩阵
- 任务编号:P0-05;任务名称:确认数据库正式支持矩阵;优先级:P0。
- 当前状态:`[!] 暂缓或存在阻塞`。
- 六阶段:需求确认 `[~]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[!]`;最终验收 `[ ]`。
- 问题说明:三种驱动和迁移存在,不等于正式支持级别及全部版本已经证实;实机证据不足。
- 当前状态:`[~] 进行中`。
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[!]`;最终验收 `[ ]`。
- 问题说明:本批修复实库暴露的迁移文件头 BOM 问题,MySQL 5.7.44 和 8.0.45 的迁移隔离验证通过;完整支持矩阵、恢复和生产证据仍不足。
- 涉及文件:`backend/internal/database/`、其 `migrations/mysql/`、`migrations/postgres/`、`migrations/sqlite/`、`backend/internal/cli/`、《构建版本与数据库支持矩阵.md》。
- 依赖任务:P0-04。
- 整改内容:明确 SQLite、MySQL、PostgreSQL 支持版本;验证 MySQL 5.7/8.0、PostgreSQL 目标版本、SQLite 锁并发;逐库检查类型、索引、默认值、事务及初始化、升级、回滚、备份恢复。不能悄然去掉难测版本。
- 验证命令:V06、V02;真实数据库测试按正式集成测试的参数运行并保存非跳过结果,不在命令行嵌入密码。
- 实机验收步骤:逐版本创建专用测试库;从空库初始化及历史版本迁移,注入失败检查事务;使用官方备份工具恢复并核对行数、资源关联和加密凭据;验证 TLS 和断线重连;只清理明确测试库。
- 验收证据:历史记录有部分数据库恢复测试;本次完整支持矩阵和当前候选实机记录未齐,不继承为全通过。
- 复审结果:支持版本及实机覆盖待确认,其他任务可继续。
- 验收证据:候选 `ee9ac85` 在 Windows 独立 MySQL 5.7.44、8.0.45 实例各完成 48 项子测试,0 失败、0 跳过;包含严格 TLS、0~9 升级、29 个语句边界重入、结构快照对照、业务关联及冷重启持久化。详见支持矩阵和执行清单。
- 复审结果:本批隔离迁移范围通过,不等于生产放行。在线连接池断线恢复、MySQL 备份恢复、PostgreSQL 当前候选复测、SQLite 并发锁及正式服务启动仍未完成;其他任务可继续。
## P0-06 建立统一领域模型

View File

@ -56,11 +56,11 @@ npm.cmd run build
| 数据库 | 预期定位 | 代码现状 | 本轮验证 | 尚未满足的正式验收 |
|---|---|---|---|---|
| SQLite | 单机、开发、轻量部署 | 驱动、初始化、迁移 1~9、CLI 备份恢复 | 临时独立库从版本 0~9 升级、重复迁移、非法历史和新版数据库拒绝 | 并发读写/锁、服务重启、完整业务数据升级恢复 |
| MySQL 5.7 | 历史兼容目标,仍保留实现 | 独立方言、迁移 1~9、部分 DDL 重入检查 | 文件/嵌入/登记一致性、已有单元测试 | 指定版本真实实例的初始化、升级、失败重入、备份恢复和业务回归 |
| MySQL 8.0 | 正式生产支持目标 | 同上 | 同上 | 同上;不能用 5.7 或 SQLite 测试替代 |
| MySQL 5.7.44 | 历史兼容目标,仍保留实现 | 独立方言、迁移 1~9、DDL 重入和文件头 BOM 处理 | `ee9ac85`:48 项 Windows 隔离实库子测试通过,覆盖 0~9 升级、全部 29 个语句边界、结构快照、严格 TLS、业务关联与冷重启持久化 | 在线断线恢复、CLI 备份恢复、Web 初始化和完整业务回归、目标生产系统验证 |
| MySQL 8.0.45 | 正式生产支持目标 | 同上 | 同候选独立实库 48 项通过,不复用 5.7 的结果 | 同上;不代表 8.0 全部补丁版本已经验证 |
| PostgreSQL | 正式生产支持目标,实际服务端版本待本轮复核 | 独立方言、迁移 1~9、严格 TLS 和官方备份恢复工具接入 | 文件/嵌入/登记一致性、凭据/TLS 单元测试 | 当前版本真实集群、初始化、升级、失败回滚、备份恢复和业务回归 |
正式支持目标不等于已经生产放行。旧文档中的 PostgreSQL 实机记录仅作为线索,不替代当前候选版本复测;本轮没有连接外部 MySQL/PostgreSQL,也没有清空生产数据库。
正式支持目标不等于已经生产放行。旧文档中的 PostgreSQL 实机记录仅作为线索,不替代当前候选版本复测。本批 MySQL 测试自行初始化 loopback 独立实例,不连接本机已有服务或生产数据库;PostgreSQL 当前候选实库测试未执行。
## 三、迁移与降级边界
@ -82,3 +82,29 @@ npm.cmd run build
6. 重启服务验证持久化,完成前后端业务回归;记录未执行、跳过和失败项,不汇总为通过。
MySQL/PostgreSQL 没有当前实机证据的格子保持待验收。本矩阵不授权清理共享数据库或同机其他服务。
## 五、MySQL 隔离迁移正式回归
测试入口为 `backend/internal/database/mysql_integration_test.go`,实例生命周期由同目录的 `mysql_integration_helpers_test.go` 管理;属于正式 Go 测试,不需要辅助脚本。未显式提供程序目录时显示跳过,不得把常规 `go test ./...` 的结果当作实库通过。
本批 Windows 实际命令如下,两个版本分别执行;产物根可复用,但测试每次创建全新数据目录,不复用业务库:
```powershell
Set-Location D:\Desktop\Scert\backend
$env:SCERT_MYSQL_TEST_ROOT = 'D:\Desktop\Scert\artifacts\mysql-matrix-20260927'
$env:SCERT_MYSQL_TEST_BIN = 'E:\DB\5.7\bin'
go test -count=1 -v -timeout=8m -run '^TestMySQLRealMigrations$' ./internal/database
$env:SCERT_MYSQL_TEST_BIN = 'E:\DB\8.0\bin'
go test -count=1 -v -timeout=8m -run '^TestMySQLRealMigrations$' ./internal/database
```
安全和覆盖边界:
1. 只接受绝对程序及产物目录,不接受外部 DSN;使用 `--no-defaults`,不会读取既有实例配置。数据库管理命令只作用于本次创建的随机端口与数据目录。
2. 初始化不开放监听;首次启动在接收连接前设置随机密码。运行时仅绑定 loopback,强制 TLS,验证 CA 和 IP 身份;8.0 的额外 X 协议关闭。
3. 迁移使用库级业务账户,不用管理账户替代最低权限检查;测试保留管理账户仅用于创建隔离库和正常关闭自己的进程。
4. 每个历史起点及每个 DDL 中间状态升级后,比较表引擎、字段类型、默认值、字符集及全部索引。此比较证明升级结构与全新迁移一致,不单独证明业务设计本身完全正确。
5. 冷重启用例关闭应用连接池、停止数据库、重启后重新打开连接。开发阶段保留旧池时发现首次操作会报失效连接,在线恢复仍是待办,不用冷重启结果代替。
6. 测试正常结束会停止自己的进程,清空初始口令文件,保留日志和数据目录;产物已被 Git 忽略。非正常终止后应先核对具体进程归属,禁止批量停止所有 MySQL。
7. 本批不是发布包部署、Web 初始化、备份恢复、Windows Service 或 Linux 运行验收;PostgreSQL 和 SQLite 剩余矩阵不得据此标记通过。

View File

@ -5,6 +5,7 @@
现有正式测试保留原位,不为目录整理而删除或迁移:
- 后端:`backend/internal/` 下的 `*_test.go`,在 `backend/` 执行 `go test ./...` 和 `go vet ./...`。
- MySQL 隔离实库:`backend/internal/database/mysql_integration_test.go`;显式提供程序和产物目录,分别验证 5.7/8.0,参数及安全边界见《构建版本与数据库支持矩阵.md》。默认跳过不算实库通过。
- 前端:页面旁的 `*.test.js`,在 `frontend/` 执行 `npm.cmd test`。
- 安装器:`deploy/tests/install-linux-test.py` 是已有正式安装器测试,不属于临时辅助脚本。
- 产物边界:`backend/internal/releasearchive/source_boundary_test.go`,在隔离 Git 仓库验证实际忽略行为,不依赖开发机 `.git/info/exclude`。