记录MySQL一致性快照与失败边界双版本验收证据

This commit is contained in:
xuans 2026-09-27 20:01:33 +08:00
parent 73df576c1c
commit 20c3819ce0
3 changed files with 67 additions and 6 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 | [~] | 确认数据库正式支持矩阵 | 已修复迁移、连接恢复、恢复会话切换及 DECIMAL 导出;双版本基本恢复与指定失败回滚通过 | 补 MySQL 一致性快照、对象完整性、官方工具及独立发行验证;Linux、PostgreSQL、SQLite 与正式服务门禁仍缺 | `9cf3a3b` 原有 55 项;`7bfd400` 新增 10 项隔离实库子测试,详见本轮记录 |
| P0-05 | [~] | 确认数据库正式支持矩阵 | 已修复迁移、连接恢复、恢复会话、精确数值、跨表快照及取消后的锁等待;双版本失败文件保护通过 | 补对象完整性、官方工具及独立发行验证;Linux、PostgreSQL、SQLite 与正式服务门禁仍缺 | `73df576` 双版本各 77 项实库子测试,0 失败、0 跳过;详见支持矩阵第八节 |
| P0-06 | [~] | 建立统一领域模型 | 已有域名、证书、任务、服务器等实体,项目和部署关联仍需审查 | 补齐资源关系图、外键/归属和任务关联 | 模型文档、迁移检查、接口测试 |
| P0-07 | [~] | 增加项目级权限和资源隔离 | 用户组和角色已有实现,项目级资源边界未闭环 | 为证书、DNS、服务器、任务和审计补齐项目归属及越权测试 | 权限矩阵、接口越权测试 |
| P0-08 | [~] | 完善凭据和主密钥生命周期 | 已有凭据存储与测试,轮换、恢复、删除和失效证据不完整 | 补齐创建、轮换、恢复、删除、脱敏和不可恢复边界 | 安全测试、日志审查、恢复演练 |
@ -303,3 +303,16 @@ P0-05 从 `[!]` 调整为 `[~]`,并未标记完成;P0-04 剩余门禁和全
- `[ ]` 下一步:MySQL 并发写入下一致性快照、视图/触发器/生成列等对象完整性、官方工具互操作、独立发行命令及真实网络故障验证。历史 DECIMAL 备份没有自动修复,不能把新备份的回归结果用于旧档案。
正式测试和 JSON 证据命令见《构建版本与数据库支持矩阵.md》第七节;产物位于 `artifacts/mysql-restore-session-20260927/`,不提交。测试只创建独立 loopback 实例,未清理共享数据库,也没有新增辅助脚本。P0-05 仍为 `[~]`,44 项目标保持原范围。
### 2026-09-27:P0-05 MySQL 跨表快照与备份失败边界
跨表快照修复 `8d742fe` 已提交并通过双版本回归。本批约 19:48 开始,修改前检查点 `79d7042`,产品与测试候选 `73df576`,均已推送。
- `[x]` 跨表快照:两种空闲连接配置下,用第二张表的真实写锁控制并发边界;修复前备份恢复出从未真实存在的 `(0,1)`,修复后恢复为同一快照的 `(0,0)`。所有 InnoDB 表共享只读可重复读事务。
- `[x]` 取消故障实证:首表已导出、第二张表等待元数据锁时取消,原实现返回取消错误后,首表 DDL 仍超过 5 秒被阻塞;两种目标文件状态均复现。修复为备份专用会话设置 5 秒的单次元数据锁等待上限,不修改数据库全局配置。
- `[x]` 新增 10 项实库用例:拒绝 MyISAM/视图;中途取消、SQL 中断、锁超时各覆盖目标文件不存在与已存在;临时文件冲突;发布重命名失败。检查错误类别、不发布残缺备份、保留既有文件、清理本次临时文件及失败后释放首表元数据锁。
- `[x]` 最终候选复测:Windows MySQL 5.7.44、8.0.45 各 77 项子测试通过,0 失败、0 跳过。全量后端测试、`go vet ./...`、`go mod verify` 通过;Linux CLI 测试包交叉编译通过,未在 Linux 运行。前端未修改,未重跑。
- `[x]` 收尾:本批目录中 18 个隔离实例均退出,已记录端口无监听,初始化口令文件为空;共享 MySQL 进程保持不变。测试数据、随机测试密钥及日志仅留在忽略目录,不提交。
- `[ ]` 后续:对象完整性、官方工具互操作、独立发行命令、Linux 实库与正式业务初始化;继续 PostgreSQL、SQLite 剩余矩阵及全部 44 项整改。
证据为 `artifacts/mysql-backup-boundaries-20260927/mysql57-73df576.jsonl` 和 `mysql80-73df576.jsonl`;命令和限制见《构建版本与数据库支持矩阵.md》第八节。这里验证的是指定锁等待和文件失败场景,不宣称任意查询取消都立即释放服务器资源,也不把临时拒绝视图等对象视为完整支持。P0-05 继续标记 `[~]`,不作生产放行。

View File

@ -63,14 +63,14 @@
- 任务编号:P0-05;任务名称:确认数据库正式支持矩阵;优先级:P0。
- 当前状态:`[~] 进行中`。
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[!]`;最终验收 `[ ]`。
- 问题说明:已修复实库暴露的迁移 BOM、Windows 空闲连接恢复、恢复会话切换及 DECIMAL 导出错误;MySQL 双版本的基本备份恢复和指定失败回滚验证通过,一致性快照、官方工具及独立发行验证仍不足。
- 问题说明:已修复迁移 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 项迁移及连接恢复子测试;`7bfd400` 新增 10 项基本备份恢复、会话、错误停止、取消及同进程正式命令回归,包含 SQL 导入失败和证书恢复失败后的数据与配置回滚。详见支持矩阵第七节和执行清单。
- 复审结果:上述 Windows 隔离范围通过,不等于生产放行。MySQL 一致性快照、对象完整性、官方工具与独立发行命令、Linux 实库、PostgreSQL 当前复测、SQLite 并发锁及正式服务验收仍未完成;其他任务可继续。
- 验收证据:`9cf3a3b` 的 55 项迁移及连接恢复、`7bfd400` 的 10 项基本备份恢复与同进程正式命令回归之外,`8d742fe` 增加 2 项跨表快照用例,`73df576` 增加 10 项备份失败边界用例。最终候选在 Windows MySQL 5.7.44、8.0.45 各 77 项子测试通过,0 失败、0 跳过。详见支持矩阵第八节和执行清单。
- 复审结果:上述 Windows 隔离范围通过,不等于生产放行。只验证 InnoDB 数据快照,不承诺并发 DDL 一致性;非事务表和视图拒绝属于临时安全边界,不替代对象完整性验收。官方工具与独立发行命令、Linux 实库、PostgreSQL 当前复测、SQLite 并发锁及正式服务验收仍未完成;其他任务可继续。
## P0-06 建立统一领域模型

View File

@ -56,7 +56,7 @@ npm.cmd run build
| 数据库 | 预期定位 | 代码现状 | 本轮验证 | 尚未满足的正式验收 |
|---|---|---|---|---|
| SQLite | 单机、开发、轻量部署 | 驱动、初始化、迁移 1~9、CLI 备份恢复 | 临时独立库从版本 0~9 升级、重复迁移、非法历史和新版数据库拒绝 | 并发读写/锁、服务重启、完整业务数据升级恢复 |
| MySQL 5.7.44 | 历史兼容目标,仍保留实现 | 独立方言、迁移 1~9、DDL 重入、BOM 处理、Windows 连接恢复及基本 SQL 备份恢复 | 原有 55 项迁移和连接恢复;`7bfd400` 新增 10 项基本恢复、会话、取消及同进程正式命令失败回滚测试 | 一致性快照、对象完整性、官方工具与独立发行命令、Linux 实库、Web 初始化和目标生产系统验证 |
| MySQL 5.7.44 | 历史兼容目标,仍保留实现 | 独立方言、迁移 1~9、DDL 重入、BOM 处理、Windows 连接恢复、InnoDB 快照及 SQL 备份恢复 | `73df576`:77 项迁移、连接恢复、备份恢复、跨表快照和指定失败边界子测试通过 | 对象完整性、官方工具与独立发行命令、Linux 实库、Web 初始化和目标生产系统验证 |
| MySQL 8.0.45 | 正式生产支持目标 | 同上 | 同候选独立实库验证原有及新增场景,不复用 5.7 的结果 | 同上;不代表 8.0 全部补丁版本已经验证 |
| PostgreSQL | 正式生产支持目标,实际服务端版本待本轮复核 | 独立方言、迁移 1~9、严格 TLS 和官方备份恢复工具接入 | 文件/嵌入/登记一致性、凭据/TLS 单元测试 | 当前版本真实集群、初始化、升级、失败回滚、备份恢复和业务回归 |
@ -170,6 +170,54 @@ JSON 日志保存为 `artifacts/mysql-restore-session-20260927/mysql57-7bfd400.j
本批边界与剩余门禁:
- TLS 注册名只存在于测试进程,正式命令测试是同进程调用,不是独立发行二进制验收。Linux CLI 测试包仅交叉编译,未在 Linux 运行。
- 导出尚无跨表统一一致性快照;并发写入和 DDL 下的一致性不能据此宣称通过。
- 本节候选尚无跨表统一一致性快照;后续 InnoDB 数据快照见第八节,并发 DDL 一致性仍不承诺。
- 视图、触发器、生成列、更多 SQL 模式与对象清单完整性仍须验证,不能把已测试表类型扩展为任意 MySQL 对象支持。
- 当前仍使用自有 SQL 导出;官方工具互操作、独立 CLI、完整生产业务及服务重启验收必须补齐。PostgreSQL、SQLite 和其他 44 项整改不因本批局部通过而缩减。
## 八、MySQL 跨表快照与备份失败边界
跨表快照候选为 `8d742fe`;取消锁等待与失败边界候选为 `73df576`。正式测试入口是 `mysql_snapshot_integration_test.go`、`mysql_backup_failure_integration_test.go`,均位于 `backend/internal/cli/`,复用第五节的隔离夹具;没有新增辅助验收脚本。
### 实现与复现
1. 备份枚举表、读取表结构和数据使用同一只读可重复读事务。数据快照在首次一致性读取时建立,不声称事务开始瞬间已建立快照;外部并发 DDL 仍须禁止。
2. 跨表测试锁住第二张表,等首表已导出后依次更新两张表,再解锁并恢复到另一个空库。数据库状态依次为 `(0,0)`、`(1,0)`、`(1,1)`;原实现恢复为从未出现的 `(0,1)`,现实现两种连接池配置均恢复为 `(0,0)`。
3. 取消测试也使用同一真实锁边界。修复前客户端已经返回取消,但首表的后续 DDL 在 5 秒内不能取得锁。备份现在仅对自己的会话执行 `SET SESSION lock_wait_timeout = 5`;双版本实测取消后约 5 秒释放本场景阻塞,未修改全局值。
4. 该限制针对单次元数据锁获取,不是整个备份的 5 秒执行期限,不为任意查询、多个锁等待或任意网络故障承诺统一取消完成时间。备份遇到锁超时直接失败,不重放事务;维护期间需要排除外部 DDL。
5. 当前只允许 InnoDB 基础表;MyISAM 和视图明确失败,避免静默声称一致性备份。拒绝只是当前安全边界,不能将对象完整性任务标记完成。
6. 成功发布前结束事务、同步并关闭临时文件、检查取消再重命名。失败只清理本次独占创建的临时文件;原有目标文件、其他操作占用的临时文件和目录内容不被修改。
### 新增正式回归
| 场景 | 子测试数 | 关键断言 |
|---|---:|---|
| 跨表并发写入快照 | 2 | 两种空闲连接配置;真实导出并恢复后两表均为原快照 |
| MyISAM、视图 | 2 | 明确拒绝;不替换原有备份,不遗留本次临时文件 |
| 首表导出后取消 | 2 | 保留取消错误;分别验证无目标文件和已有目标文件;首表 DDL 恢复可执行 |
| 首表导出后 SQL 中断 | 2 | 管理连接仅中断已确认的本次备份语句;保留错误 1317,文件与锁收尾正确 |
| 元数据锁等待超时 | 2 | 自然触发错误 1205;不靠测试解锁促成返回,文件与锁收尾正确 |
| 临时文件冲突 | 1 | 保留已有目标及其他操作的临时文件 |
| 重命名发布失败 | 1 | 非空目录占用目标时返回发布错误,目录内容保留,本次临时文件清理 |
其中跨表快照为上一批新增 2 项,本批失败边界新增 10 项;加此前 65 项,最终每版 77 项。统计口径仍包含既有嵌套子测试,不将父级包成功再加一次。
### 最终候选证据
在 `backend/` 执行,两个版本各运行一次,明确提供程序目录,不接受跳过结果:
```powershell
$env:SCERT_MYSQL_TEST_ROOT = 'D:\Desktop\Scert\artifacts\mysql-backup-boundaries-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 |
Tee-Object -FilePath '../artifacts/mysql-backup-boundaries-20260927/mysql57-73df576.jsonl'
# 换为 E:\DB\8.0\bin,输出文件换为 mysql80-73df576.jsonl,再执行相同测试。
```
| 实际版本 | 数据库包 | CLI 包 | 通过子测试 | 失败 / 跳过 |
|---|---:|---:|---:|---:|
| MySQL 5.7.44 | 44.591 秒 | 41.001 秒 | 77 | 0 / 0 |
| MySQL 8.0.45 | 53.844 秒 | 51.178 秒 | 77 | 0 / 0 |
常规 `go test -count=1 ./...`、`go vet ./...`、`go mod verify` 通过。Linux CLI 测试包仅交叉编译成功,未作实库运行。最终复测创建 12 个隔离实例,连同复现和定向测试,本批目录共 18 个实例;全部正常退出,已记录端口无监听,初始化口令文件为空,共享 MySQL 进程不变。数据目录、随机测试密钥、日志和二进制均被忽略,不提交或分发。
剩余验收明确保留:触发器、生成列、例程、事件和视图等对象的完整性;官方工具互操作与独立发行 CLI;磁盘写满、同步失败和掉电等更广泛文件系统故障;Linux 实库、完整 Web 业务和服务部署;PostgreSQL、SQLite 剩余矩阵。本批不得替代这些证据,也不得据此关闭 P0-05 或全部 44 项目标。