From 0c73eef7fe1db1b4983ddc4b776ddefcdad9a1a8 Mon Sep 17 00:00:00 2001 From: xuans Date: Sun, 27 Sep 2026 19:11:20 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95MySQL=E5=8F=8C=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=9C=A8=E7=BA=BF=E6=81=A2=E5=A4=8D=E8=AF=81=E6=8D=AE?= =?UTF-8?q?=E5=8F=8A=E5=89=A9=E4=BD=99=E9=AA=8C=E6=94=B6=E9=97=A8=E7=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/Scert整改任务执行清单.md | 16 +++++++++++- doc/基础整改任务规格.md | 6 ++--- doc/构建版本与数据库支持矩阵.md | 28 ++++++++++++++++++--- tests/README.md | 1 + 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/doc/Scert整改任务执行清单.md b/doc/Scert整改任务执行清单.md index 9af07d0..c2635df 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 阻塞,MySQL 5.7.44/8.0.45 各 48 项隔离实库迁移测试通过 | 补在线断线恢复、MySQL 备份恢复、PostgreSQL 当前复测及 SQLite 并发锁;正式服务验收仍缺 | `ee9ac85`、双版本严格 TLS、29 个重入边界、结构快照和冷重启持久化 | +| P0-05 | [~] | 确认数据库正式支持矩阵 | 已修复迁移 BOM 及 Windows 空闲连接恢复,MySQL 5.7.44/8.0.45 各 55 项隔离实库测试通过 | 补 Linux 实库恢复、MySQL 备份恢复、PostgreSQL 当前复测及 SQLite 并发锁;正式服务验收仍缺 | `9cf3a3b`、双版本严格 TLS、29 个重入边界、结构快照、冷重启与在线连接恢复 | | P0-06 | [~] | 建立统一领域模型 | 已有域名、证书、任务、服务器等实体,项目和部署关联仍需审查 | 补齐资源关系图、外键/归属和任务关联 | 模型文档、迁移检查、接口测试 | | P0-07 | [~] | 增加项目级权限和资源隔离 | 用户组和角色已有实现,项目级资源边界未闭环 | 为证书、DNS、服务器、任务和审计补齐项目归属及越权测试 | 权限矩阵、接口越权测试 | | P0-08 | [~] | 完善凭据和主密钥生命周期 | 已有凭据存储与测试,轮换、恢复、删除和失效证据不完整 | 补齐创建、轮换、恢复、删除、脱敏和不可恢复边界 | 安全测试、日志审查、恢复演练 | @@ -276,3 +276,17 @@ artifacts/mysql-matrix-20260927/mysql80-ee9ac85.log ``` P0-05 从 `[!]` 调整为 `[~]`,并未标记完成;P0-04 剩余门禁和全部 44 项原始范围保持不变。下一步需继续处理在线数据库连接恢复、MySQL 备份恢复及完整业务初始化,再补 PostgreSQL 当前候选和 SQLite 并发锁证据。 + +### 2026-09-27:P0-05 Windows MySQL 在线连接恢复 + +整改前检查点 `f0a9475`;实现候选 `9cf3a3b`。新增正式 Go 回归首先在未修复代码的 MySQL 5.7.44 重现:保留应用池、重启独立数据库后,第一条业务写入返回 `invalid connection`。没有用额外健康请求、重开应用池或业务重试绕过问题。 + +- `[x]` 根因与修复:Windows 驱动空闲检查缺位;在业务发送前增加单次最多 2 秒的复用探测,失败淘汰连接。Linux 不增加额外往返;查询、写入及提交错误保持原样。 +- `[x]` 安全边界单测:探测截止时间、取消、失败关闭、仅在写入前替换连接,以及查询、写入、提交不确定时不自动重放。 +- `[x]` 双版本隔离实库:每个版本原有 48 项迁移及安全测试,加 7 项连接恢复、预编译、参数转换和事务测试,合计 55 项通过,0 失败、0 跳过。 +- `[x]` 后端回归:`go test -p 1 -count=1 -timeout=3m ./...`、`go vet -p=1 ./...`、`go mod verify` 通过;Linux 数据库测试包交叉编译通过。本批没有改前端,未重跑前端测试。 +- `[ ]` 尚缺:Linux 实库恢复、真实网络提交确认丢失演练、MySQL CLI 备份恢复、正式 Web 初始化和业务回归;不能用上述测试替代服务部署验收。 + +实现、命令、行为成本及更完整的覆盖边界见《构建版本与数据库支持矩阵.md》第六节。最终日志位于 `artifacts/mysql-matrix-20260927/mysql57-9cf3a3b.log`、`mysql80-9cf3a3b.log`,测试产物不提交。共享 MySQL 服务不在测试操作范围。 + +本批只关闭 Windows 隔离环境中已复现的首次请求故障,不把 P0-05 或全部 44 项标记完成。下一批继续 MySQL 备份恢复的实库一致性与失败回滚门禁。 diff --git a/doc/基础整改任务规格.md b/doc/基础整改任务规格.md index b0f9c66..8964d24 100644 --- a/doc/基础整改任务规格.md +++ b/doc/基础整改任务规格.md @@ -63,14 +63,14 @@ - 任务编号:P0-05;任务名称:确认数据库正式支持矩阵;优先级:P0。 - 当前状态:`[~] 进行中`。 - 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[!]`;最终验收 `[ ]`。 -- 问题说明:本批修复实库暴露的迁移文件头 BOM 问题,MySQL 5.7.44 和 8.0.45 的迁移隔离验证通过;完整支持矩阵、恢复和生产证据仍不足。 +- 问题说明:已修复实库暴露的迁移文件头 BOM 和 Windows 空闲连接恢复问题,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 并发锁及正式服务启动仍未完成;其他任务可继续。 +- 验收证据:候选 `9cf3a3b` 在 Windows 独立 MySQL 5.7.44、8.0.45 实例各完成 55 项子测试,0 失败、0 跳过;包含严格 TLS、0~9 升级、29 个语句边界重入、结构快照对照、业务关联、冷重启持久化及 7 项在线恢复与事务场景。详见支持矩阵和执行清单。 +- 复审结果:Windows 隔离迁移及连接恢复范围通过,不等于生产放行。Linux 实库恢复、MySQL 备份恢复、PostgreSQL 当前候选复测、SQLite 并发锁及正式服务启动仍未完成;其他任务可继续。 ## P0-06 建立统一领域模型 diff --git a/doc/构建版本与数据库支持矩阵.md b/doc/构建版本与数据库支持矩阵.md index a4ddfca..7bdfe67 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 处理 | `ee9ac85`:48 项 Windows 隔离实库子测试通过,覆盖 0~9 升级、全部 29 个语句边界、结构快照、严格 TLS、业务关联与冷重启持久化 | 在线断线恢复、CLI 备份恢复、Web 初始化和完整业务回归、目标生产系统验证 | -| MySQL 8.0.45 | 正式生产支持目标 | 同上 | 同候选独立实库 48 项通过,不复用 5.7 的结果 | 同上;不代表 8.0 全部补丁版本已经验证 | +| 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 全部补丁版本已经验证 | | PostgreSQL | 正式生产支持目标,实际服务端版本待本轮复核 | 独立方言、迁移 1~9、严格 TLS 和官方备份恢复工具接入 | 文件/嵌入/登记一致性、凭据/TLS 单元测试 | 当前版本真实集群、初始化、升级、失败回滚、备份恢复和业务回归 | 正式支持目标不等于已经生产放行。旧文档中的 PostgreSQL 实机记录仅作为线索,不替代当前候选版本复测。本批 MySQL 测试自行初始化 loopback 独立实例,不连接本机已有服务或生产数据库;PostgreSQL 当前候选实库测试未执行。 @@ -105,6 +105,28 @@ go test -count=1 -v -timeout=8m -run '^TestMySQLRealMigrations$' ./internal/data 2. 初始化不开放监听;首次启动在接收连接前设置随机密码。运行时仅绑定 loopback,强制 TLS,验证 CA 和 IP 身份;8.0 的额外 X 协议关闭。 3. 迁移使用库级业务账户,不用管理账户替代最低权限检查;测试保留管理账户仅用于创建隔离库和正常关闭自己的进程。 4. 每个历史起点及每个 DDL 中间状态升级后,比较表引擎、字段类型、默认值、字符集及全部索引。此比较证明升级结构与全新迁移一致,不单独证明业务设计本身完全正确。 -5. 冷重启用例关闭应用连接池、停止数据库、重启后重新打开连接。开发阶段保留旧池时发现首次操作会报失效连接,在线恢复仍是待办,不用冷重启结果代替。 +5. 冷重启用例关闭应用连接池、停止数据库、重启后重新打开连接。保留旧池的独立在线恢复测试见第六节,不能用冷重启结果代替。 6. 测试正常结束会停止自己的进程,清空初始口令文件,保留日志和数据目录;产物已被 Git 忽略。非正常终止后应先核对具体进程归属,禁止批量停止所有 MySQL。 7. 本批不是发布包部署、Web 初始化、备份恢复、Windows Service 或 Linux 运行验收;PostgreSQL 和 SQLite 剩余矩阵不得据此标记通过。 + +## 六、MySQL 在线连接池恢复 + +正式入口:`backend/internal/database/mysql_recovery_integration_test.go`;复用第五节隔离夹具。两个版本分别设置程序目录后运行: + +```powershell +go test -count=1 -v -timeout=8m -run '^TestMySQLReal(Migrations|PoolRecovery)$' ./internal/database +``` + +实现和行为边界: + +1. 锁定的 MySQL 驱动在 Windows 上没有有效的空闲套接字检查。复用连接之前通过驱动的 `SessionResetter` 增加一次有界 `COM_PING`;Linux 保留驱动原有检查,不增加这次往返。 +2. 单次探测最多 2 秒;调用者更短的截止时间或取消优先。探测失败关闭连接并返回 `driver.ErrBadConn`,让连接池在发送业务语句之前更换连接。 +3. 完整保留驱动的查询、写入、预编译、事务、参数转换和连接校验接口。不包装业务执行及提交错误,不新增 SQL 或事务重放逻辑。 +4. `checkConnLiveness` 默认开启;显式关闭时不启用上述额外检查,不保证失效空闲连接上的首次请求成功。连接仍可能在探测成功后断开,应用必须处理执行错误及提交结果不确定性。 +5. 成本是 Windows 每次复用池连接时增加一次协议往返;同一已取得的事务连接内部不重复探测。当前没有远距离网络性能基准,不以 loopback 测试推断生产延迟。 + +新增 7 个实库场景每个使用单独业务库:保留旧池并重启数据库后的首次写入、空闲断线后的预编译语句、首次查询及迁移、无符号整数参数及正常提交、只读事务与正常回滚、活动事务连接中断、数据库不可用时有界失败并恢复。每次故障后的数据值均验证,避免把重复写入或未提交数据当作恢复成功。 + +`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 实库恢复;其门禁仍然保留。 diff --git a/tests/README.md b/tests/README.md index 67196ab..70134a4 100644 --- a/tests/README.md +++ b/tests/README.md @@ -6,6 +6,7 @@ - 后端:`backend/internal/` 下的 `*_test.go`,在 `backend/` 执行 `go test ./...` 和 `go vet ./...`。 - MySQL 隔离实库:`backend/internal/database/mysql_integration_test.go`;显式提供程序和产物目录,分别验证 5.7/8.0,参数及安全边界见《构建版本与数据库支持矩阵.md》。默认跳过不算实库通过。 +- MySQL 在线连接恢复:同目录 `mysql_recovery_integration_test.go`;保留应用连接池并重启自己的隔离数据库,验证首次操作、事务和故障边界;不重启共享服务,不用业务重试掩盖错误。 - 前端:页面旁的 `*.test.js`,在 `frontend/` 执行 `npm.cmd test`。 - 安装器:`deploy/tests/install-linux-test.py` 是已有正式安装器测试,不属于临时辅助脚本。 - 产物边界:`backend/internal/releasearchive/source_boundary_test.go`,在隔离 Git 仓库验证实际忽略行为,不依赖开发机 `.git/info/exclude`。