diff --git a/doc/Scert整改任务执行清单.md b/doc/Scert整改任务执行清单.md index c2635df..9f62361 100644 --- a/doc/Scert整改任务执行清单.md +++ b/doc/Scert整改任务执行清单.md @@ -39,7 +39,7 @@ | P0-02 | [x] | 建立完整任务清单 | 44 项逐项规格、原始编号名称、字段、六阶段、引用和汇总状态核对通过 | 等待最终复审,随实现同步状态和证据 | 四份规格、统一验收约定及 `fab98d1` 独立克隆 | | P0-03 | [x] | 整理源码、构建产物和部署产物 | 全仓库及子目录规则、目录说明、正式回归和独立克隆构建校验通过 | 等待最终复审,后续提交继续执行边界检查 | 正式 Go 回归、完整索引、双平台 33 项清单及解包校验 | | P0-04 | [~] | 统一开发和构建版本 | 精确工具链、安装策略、发布前后校验、系统清单及固定换行已实现,双独立克隆和完整自动化通过 | Linux 原生构建与双平台实际运行环境记录,不以交叉编译替代 | `94237b8`、175 项前端测试、后端完整回归、4 个 Web 文件一致、33 项清单和解包校验 | -| P0-05 | [~] | 确认数据库正式支持矩阵 | 已修复迁移 BOM 及 Windows 空闲连接恢复,MySQL 5.7.44/8.0.45 各 55 项隔离实库测试通过 | 补 Linux 实库恢复、MySQL 备份恢复、PostgreSQL 当前复测及 SQLite 并发锁;正式服务验收仍缺 | `9cf3a3b`、双版本严格 TLS、29 个重入边界、结构快照、冷重启与在线连接恢复 | +| P0-05 | [~] | 确认数据库正式支持矩阵 | 已修复迁移、连接恢复、恢复会话切换及 DECIMAL 导出;双版本基本恢复与指定失败回滚通过 | 补 MySQL 一致性快照、对象完整性、官方工具及独立发行验证;Linux、PostgreSQL、SQLite 与正式服务门禁仍缺 | `9cf3a3b` 原有 55 项;`7bfd400` 新增 10 项隔离实库子测试,详见本轮记录 | | P0-06 | [~] | 建立统一领域模型 | 已有域名、证书、任务、服务器等实体,项目和部署关联仍需审查 | 补齐资源关系图、外键/归属和任务关联 | 模型文档、迁移检查、接口测试 | | P0-07 | [~] | 增加项目级权限和资源隔离 | 用户组和角色已有实现,项目级资源边界未闭环 | 为证书、DNS、服务器、任务和审计补齐项目归属及越权测试 | 权限矩阵、接口越权测试 | | P0-08 | [~] | 完善凭据和主密钥生命周期 | 已有凭据存储与测试,轮换、恢复、删除和失效证据不完整 | 补齐创建、轮换、恢复、删除、脱敏和不可恢复边界 | 安全测试、日志审查、恢复演练 | @@ -290,3 +290,16 @@ P0-05 从 `[!]` 调整为 `[~]`,并未标记完成;P0-04 剩余门禁和全 实现、命令、行为成本及更完整的覆盖边界见《构建版本与数据库支持矩阵.md》第六节。最终日志位于 `artifacts/mysql-matrix-20260927/mysql57-9cf3a3b.log`、`mysql80-9cf3a3b.log`,测试产物不提交。共享 MySQL 服务不在测试操作范围。 本批只关闭 Windows 隔离环境中已复现的首次请求故障,不把 P0-05 或全部 44 项标记完成。下一批继续 MySQL 备份恢复的实库一致性与失败回滚门禁。 + +### 2026-09-27:P0-05 MySQL 基本备份恢复与指定失败回滚 + +共享夹具重构 `07429ad` 已通过双版本原有 55 项回归;本批修改前检查点 `ac205e2`,产品修复及正式测试候选 `7bfd400`。 + +- `[x]` 修复前实证:MySQL 5.7.44 禁用空闲连接时,跨语句会话变量丢失,恢复返回 1048;DECIMAL 被导出为十六进制字面量,基本恢复返回 1264。两者都先由正式 Go 测试复现。 +- `[x]` 修复:恢复全过程使用同一连接,出错即返回,不通过换连接重放;根据列类型将 DECIMAL 保存为精确文本,二进制数据仍用十六进制字面量,不经浮点转换。 +- `[x]` 新增 10 项双版本实库子测试:固定会话;两种空闲连接配置下的基本恢复、出错停止、提前取消;同进程正式备份恢复命令成功、SQL 导入失败、证书恢复失败。验证中文与特殊字符、二进制、DECIMAL、NULL、微秒时间、自增、外键,以及数据库、配置、加密凭据和证书文件的恢复或回滚。 +- `[x]` 候选最终复测:5.7.44、8.0.45 各 65 项子测试通过,0 失败、0 跳过;8 个本批实例已退出,端口关闭,初始化口令文件清空,共享 MySQL 进程不变。 +- `[x]` 后端全量 `go test -count=1 ./...`、`go vet ./...`、`go mod verify` 通过;Linux CLI 测试包交叉编译通过,未执行 Linux 实库。前端未修改,未重跑。 +- `[ ]` 下一步:MySQL 并发写入下一致性快照、视图/触发器/生成列等对象完整性、官方工具互操作、独立发行命令及真实网络故障验证。历史 DECIMAL 备份没有自动修复,不能把新备份的回归结果用于旧档案。 + +正式测试和 JSON 证据命令见《构建版本与数据库支持矩阵.md》第七节;产物位于 `artifacts/mysql-restore-session-20260927/`,不提交。测试只创建独立 loopback 实例,未清理共享数据库,也没有新增辅助脚本。P0-05 仍为 `[~]`,44 项目标保持原范围。 diff --git a/doc/基础整改任务规格.md b/doc/基础整改任务规格.md index 8964d24..54d500c 100644 --- a/doc/基础整改任务规格.md +++ b/doc/基础整改任务规格.md @@ -63,14 +63,14 @@ - 任务编号:P0-05;任务名称:确认数据库正式支持矩阵;优先级:P0。 - 当前状态:`[~] 进行中`。 - 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[!]`;最终验收 `[ ]`。 -- 问题说明:已修复实库暴露的迁移文件头 BOM 和 Windows 空闲连接恢复问题,MySQL 5.7.44 和 8.0.45 的隔离迁移、连接恢复验证通过;完整支持矩阵、备份恢复和生产证据仍不足。 +- 问题说明:已修复实库暴露的迁移 BOM、Windows 空闲连接恢复、恢复会话切换及 DECIMAL 导出错误;MySQL 双版本的基本备份恢复和指定失败回滚验证通过,一致性快照、官方工具及独立发行验证仍不足。 - 涉及文件:`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 和断线重连;只清理明确测试库。 -- 验收证据:候选 `9cf3a3b` 在 Windows 独立 MySQL 5.7.44、8.0.45 实例各完成 55 项子测试,0 失败、0 跳过;包含严格 TLS、0~9 升级、29 个语句边界重入、结构快照对照、业务关联、冷重启持久化及 7 项在线恢复与事务场景。详见支持矩阵和执行清单。 -- 复审结果:Windows 隔离迁移及连接恢复范围通过,不等于生产放行。Linux 实库恢复、MySQL 备份恢复、PostgreSQL 当前候选复测、SQLite 并发锁及正式服务启动仍未完成;其他任务可继续。 +- 验收证据:候选 `9cf3a3b` 在 Windows MySQL 5.7.44、8.0.45 各完成 55 项迁移及连接恢复子测试;`7bfd400` 新增 10 项基本备份恢复、会话、错误停止、取消及同进程正式命令回归,包含 SQL 导入失败和证书恢复失败后的数据与配置回滚。详见支持矩阵第七节和执行清单。 +- 复审结果:上述 Windows 隔离范围通过,不等于生产放行。MySQL 一致性快照、对象完整性、官方工具与独立发行命令、Linux 实库、PostgreSQL 当前复测、SQLite 并发锁及正式服务验收仍未完成;其他任务可继续。 ## P0-06 建立统一领域模型 diff --git a/doc/构建版本与数据库支持矩阵.md b/doc/构建版本与数据库支持矩阵.md index 7bdfe67..78c7014 100644 --- a/doc/构建版本与数据库支持矩阵.md +++ b/doc/构建版本与数据库支持矩阵.md @@ -56,8 +56,8 @@ npm.cmd run build | 数据库 | 预期定位 | 代码现状 | 本轮验证 | 尚未满足的正式验收 | |---|---|---|---|---| | SQLite | 单机、开发、轻量部署 | 驱动、初始化、迁移 1~9、CLI 备份恢复 | 临时独立库从版本 0~9 升级、重复迁移、非法历史和新版数据库拒绝 | 并发读写/锁、服务重启、完整业务数据升级恢复 | -| MySQL 5.7.44 | 历史兼容目标,仍保留实现 | 独立方言、迁移 1~9、DDL 重入、文件头 BOM 处理及 Windows 空闲连接恢复 | `9cf3a3b`:55 项 Windows 隔离实库子测试通过,包括原有 48 项迁移及安全场景、7 项连接恢复与事务场景 | Linux 同候选恢复实测、CLI 备份恢复、Web 初始化和完整业务回归、目标生产系统验证 | -| MySQL 8.0.45 | 正式生产支持目标 | 同上 | 同候选独立实库 55 项通过,不复用 5.7 的结果 | 同上;不代表 8.0 全部补丁版本已经验证 | +| MySQL 5.7.44 | 历史兼容目标,仍保留实现 | 独立方言、迁移 1~9、DDL 重入、BOM 处理、Windows 连接恢复及基本 SQL 备份恢复 | 原有 55 项迁移和连接恢复;`7bfd400` 新增 10 项基本恢复、会话、取消及同进程正式命令失败回滚测试 | 一致性快照、对象完整性、官方工具与独立发行命令、Linux 实库、Web 初始化和目标生产系统验证 | +| MySQL 8.0.45 | 正式生产支持目标 | 同上 | 同候选独立实库验证原有及新增场景,不复用 5.7 的结果 | 同上;不代表 8.0 全部补丁版本已经验证 | | PostgreSQL | 正式生产支持目标,实际服务端版本待本轮复核 | 独立方言、迁移 1~9、严格 TLS 和官方备份恢复工具接入 | 文件/嵌入/登记一致性、凭据/TLS 单元测试 | 当前版本真实集群、初始化、升级、失败回滚、备份恢复和业务回归 | 正式支持目标不等于已经生产放行。旧文档中的 PostgreSQL 实机记录仅作为线索,不替代当前候选版本复测。本批 MySQL 测试自行初始化 loopback 独立实例,不连接本机已有服务或生产数据库;PostgreSQL 当前候选实库测试未执行。 @@ -85,7 +85,7 @@ MySQL/PostgreSQL 没有当前实机证据的格子保持待验收。本矩阵不 ## 五、MySQL 隔离迁移正式回归 -测试入口为 `backend/internal/database/mysql_integration_test.go`,实例生命周期由同目录的 `mysql_integration_helpers_test.go` 管理;属于正式 Go 测试,不需要辅助脚本。未显式提供程序目录时显示跳过,不得把常规 `go test ./...` 的结果当作实库通过。 +测试入口为 `backend/internal/database/mysql_integration_test.go`;同目录的 `mysql_integration_helpers_test.go` 适配共享夹具 `backend/internal/testsupport/mysqltest/server.go`,供数据库和 CLI 正式 Go 测试复用,不需要辅助脚本,也不进入生产程序依赖。未显式提供程序目录时显示跳过,不得把常规 `go test ./...` 的结果当作实库通过。 本批 Windows 实际命令如下,两个版本分别执行;产物根可复用,但测试每次创建全新数据目录,不复用业务库: @@ -130,3 +130,46 @@ go test -count=1 -v -timeout=8m -run '^TestMySQLReal(Migrations|PoolRecovery)$' `mysql_pool_test.go` 另行验证健康探测、驱动拒绝、探测失败、截止时间、取消、写入前更换连接,以及查询、写入和提交响应不确定时保留原错误且不重放。响应丢失场景是驱动接口层故障注入,不声称已完成真实网络丢弃提交确认包的演练。 候选 `9cf3a3b` 在 Windows 的 MySQL 5.7.44、8.0.45 均为 55 项子测试通过,0 失败、0 跳过。产物位于 `artifacts/mysql-matrix-20260927/mysql57-9cf3a3b.log` 和 `mysql80-9cf3a3b.log`,不纳入源码。Linux 数据库测试包交叉编译通过,但没有执行 Linux 实库恢复;其门禁仍然保留。 + +## 七、MySQL 基本备份恢复与指定失败回滚 + +候选 `7bfd400`;正式入口为 `backend/internal/cli/mysql_integration_test.go` 和 `mysql_commands_integration_test.go`,复用严格 TLS、随机账户、全新实例的共享夹具。 + +修复前在 5.7.44 的真实数据库上复现两类错误:禁用空闲连接后,会话变量跨 SQL 语句丢失;DECIMAL 文本字节被作为十六进制数值恢复,出现数值越界。修复固定恢复连接,并依据字段类型导出精确文本;旧 DECIMAL 备份没有自动转换,应重新生成并验证备份。 + +新增测试覆盖: + +1. `MaxIdleConns=0` 时,记录并比较同一恢复脚本中的真实连接编号。 +2. 两种空闲连接配置下,恢复子表在前、父表在后的关联数据,核对中文、特殊字符、二进制、DECIMAL、NULL、微秒时间和自增;恢复后外键仍生效。 +3. 无效 SQL 前的写入保留,失败后的写入不执行;提前取消不修改当前数据库。底层导入函数不承诺事务原子性,整库回滚由正式恢复命令负责。 +4. 同进程调用正式备份和恢复命令,先执行完整 MySQL 迁移,再验证成功恢复、SQL 导入失败后的回滚、证书恢复失败后的回滚;检查业务行、审计行、配置文件、加密凭据、证书文件和恢复前快照。 + +重跑原有 55 项及新增 10 项的命令如下。两个版本分别设置程序目录,产物根每次生成独立数据目录: + +```powershell +Set-Location D:\Desktop\Scert\backend +$env:SCERT_MYSQL_TEST_ROOT = 'D:\Desktop\Scert\artifacts\mysql-restore-session-20260927' +$env:SCERT_MYSQL_TEST_BIN = 'E:\DB\5.7\bin' +go test -json -p 1 -count=1 -timeout=8m -run '^TestMySQLReal' ./internal/database ./internal/cli + +$env:SCERT_MYSQL_TEST_BIN = 'E:\DB\8.0\bin' +go test -json -p 1 -count=1 -timeout=8m -run '^TestMySQLReal' ./internal/database ./internal/cli +``` + +JSON 日志保存为 `artifacts/mysql-restore-session-20260927/mysql57-7bfd400.jsonl`、`mysql80-7bfd400.jsonl`,不纳入源码。 + +候选最终复测结果如下,均为 0 失败、0 跳过;子测试计数包含两种连接池场景及其嵌套用例: + +| 实际版本 | 数据库包 | CLI 包 | 通过子测试 | +|---|---:|---:|---:| +| MySQL 5.7.44 | 43.949 秒 | 11.350 秒 | 65 | +| MySQL 8.0.45 | 51.125 秒 | 16.803 秒 | 65 | + +最终 8 个隔离测试实例均已退出,对应端口无监听;原有 MySQL 进程保持不变,全部初始化口令文件为空。保留目录中的测试数据、随机测试密钥和日志仅作为本地忽略产物,不提交或分发。 + +本批边界与剩余门禁: + +- TLS 注册名只存在于测试进程,正式命令测试是同进程调用,不是独立发行二进制验收。Linux CLI 测试包仅交叉编译,未在 Linux 运行。 +- 导出尚无跨表统一一致性快照;并发写入和 DDL 下的一致性不能据此宣称通过。 +- 视图、触发器、生成列、更多 SQL 模式与对象清单完整性仍须验证,不能把已测试表类型扩展为任意 MySQL 对象支持。 +- 当前仍使用自有 SQL 导出;官方工具互操作、独立 CLI、完整生产业务及服务重启验收必须补齐。PostgreSQL、SQLite 和其他 44 项整改不因本批局部通过而缩减。