diff --git a/doc/Scert整改任务执行清单.md b/doc/Scert整改任务执行清单.md index 06fbd25..092471f 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 | [~] | 确认数据库正式支持矩阵 | 已修复迁移、连接恢复、恢复会话、精确数值、跨表快照及取消后的锁等待;双版本失败文件保护通过 | 补对象完整性、官方工具及独立发行验证;Linux、PostgreSQL、SQLite 与正式服务门禁仍缺 | `73df576` 双版本各 77 项实库子测试,0 失败、0 跳过;详见支持矩阵第八节 | +| P0-05 | [~] | 确认数据库正式支持矩阵 | 特殊列双向官方互操作及官方存储对象 SQL 恢复已通过;自有导出的对象完整性仍缺 | 补对象清单、权限及导出完整性、其他 SQL 模式、独立发行验证;Linux、PostgreSQL、SQLite 与正式服务门禁仍缺 | `e6e6719` 双版本分别 85、87 个叶子用例,0 失败、0 跳过;详见支持矩阵第九、十节 | | P0-06 | [~] | 建立统一领域模型 | 已有域名、证书、任务、服务器等实体,项目和部署关联仍需审查 | 补齐资源关系图、外键/归属和任务关联 | 模型文档、迁移检查、接口测试 | | P0-07 | [~] | 增加项目级权限和资源隔离 | 用户组和角色已有实现,项目级资源边界未闭环 | 为证书、DNS、服务器、任务和审计补齐项目归属及越权测试 | 权限矩阵、接口越权测试 | | P0-08 | [~] | 完善凭据和主密钥生命周期 | 已有凭据存储与测试,轮换、恢复、删除和失效证据不完整 | 补齐创建、轮换、恢复、删除、脱敏和不可恢复边界 | 安全测试、日志审查、恢复演练 | @@ -316,3 +316,19 @@ P0-05 从 `[!]` 调整为 `[~]`,并未标记完成;P0-04 剩余门禁和全 - `[ ]` 后续:对象完整性、官方工具互操作、独立发行命令、Linux 实库与正式业务初始化;继续 PostgreSQL、SQLite 剩余矩阵及全部 44 项整改。 证据为 `artifacts/mysql-backup-boundaries-20260927/mysql57-73df576.jsonl` 和 `mysql80-73df576.jsonl`;命令和限制见《构建版本与数据库支持矩阵.md》第八节。这里验证的是指定锁等待和文件失败场景,不宣称任意查询取消都立即释放服务器资源,也不把临时拒绝视图等对象视为完整支持。P0-05 继续标记 `[~]`,不作生产放行。 + +### 2026-09-27:P0-05 特殊列互操作与官方存储对象恢复 + +待提交代码审查已完成:`f260b22` 保留并修复 4 个有价值的源码和正式测试文件,无无用待提交文件被删除。本轮约 20:19 开始,检查点 `6707059`,恢复修复与正式测试候选 `e6e6719`,均已推送。 + +- `[x]` 特殊列:生成列不再写入计算结果,不可见列的非默认实际值不再遗漏,仅生成列表保留行数;修复扫描越界,用真实结构元数据比较,双版本官方工具双向验证通过。 +- `[x]` 存储对象恢复:先由真实官方导出文件复现 1064,再实现 `DELIMITER` 客户端拆句;保留复合语句、字符串和可执行版本注释,拒绝词法格式错误的部分执行。 +- `[x]` 正式对象用例:核对两个触发器的顺序与执行结果,核对过程、函数的定义、参数、权限上下文与实际调用,核对禁用事件的元数据并在独立实例显式启用后验证实际调度;源库没有被目标事件修改。 +- `[x]` 失败边界:不足权限返回数据库原始错误,不提升权限或继续后续例程;格式错误预检阻止此前建表语句执行。没有降低 TLS,也没有启用函数信任开关。 +- `[x]` 最终回归:MySQL 5.7.44、8.0.45 分别 85、87 个叶子用例通过,0 失败、0 跳过。后端全量测试、vet、模块校验通过;Linux 测试包仅交叉编译,前端未修改。 +- `[x]` 收尾:本批 22 个隔离实例退出,测试端口无监听,初始化口令文件为空;共享 MySQL 进程不变,产物没有提交。 +- `[ ]` 后续:自有导出对触发器、例程、事件、视图的完整性及有效权限检查;更多 SQL 模式、跨账户定义者、跨库引用和已启用事件恢复期间的调度隔离;独立发行 CLI、Linux 实库、PostgreSQL、SQLite 与正式业务部署。 + +证据:`artifacts/mysql-pending-review-20260927/review-mysql57.jsonl`、`review-mysql80.jsonl`;本轮为 `artifacts/mysql-stored-programs-20260927/mysql57-review.jsonl`、`mysql80-review.jsonl`。权限、官方工具选项、SQL 模式差异和准确计数口径见支持矩阵第九、十节。 + +已重新核对原始需求及执行清单,44 个任务编号全部保留。P0-05 仍为 `[~]`,没有把某个导入方向通过等同于完整备份恢复或生产放行。 diff --git a/doc/基础整改任务规格.md b/doc/基础整改任务规格.md index fdf4f9a..73b54fb 100644 --- a/doc/基础整改任务规格.md +++ b/doc/基础整改任务规格.md @@ -63,14 +63,14 @@ - 任务编号:P0-05;任务名称:确认数据库正式支持矩阵;优先级:P0。 - 当前状态:`[~] 进行中`。 - 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[!]`;最终验收 `[ ]`。 -- 问题说明:已修复迁移 BOM、Windows 空闲连接恢复、恢复会话切换、DECIMAL 导出和跨表快照错误;补齐备份取消后的元数据锁等待上限及失败文件保护。MySQL 对象完整性、官方工具及独立发行验证仍不足。 +- 问题说明:已修复迁移、连接恢复、备份会话、精确数值、跨表快照、失败文件保护、生成列和不可见列导出;现已支持本批官方存储对象 SQL 的分隔符恢复。自有导出的对象完整性、其他 SQL 模式及独立发行验证仍不足。 - 涉及文件:`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` 的 55 项迁移及连接恢复、`7bfd400` 的 10 项基本备份恢复与同进程正式命令回归之外,`8d742fe` 增加 2 项跨表快照用例,`73df576` 增加 10 项备份失败边界用例。最终候选在 Windows MySQL 5.7.44、8.0.45 各 77 项子测试通过,0 失败、0 跳过。详见支持矩阵第八节和执行清单。 -- 复审结果:上述 Windows 隔离范围通过,不等于生产放行。只验证 InnoDB 数据快照,不承诺并发 DDL 一致性;非事务表和视图拒绝属于临时安全边界,不替代对象完整性验收。官方工具与独立发行命令、Linux 实库、PostgreSQL 当前复测、SQLite 并发锁及正式服务验收仍未完成;其他任务可继续。 +- 验收证据:在既有迁移、连接恢复、快照和失败边界基础上,`f260b22` 增加特殊列双向官方工具互操作,`e6e6719` 增加官方存储对象恢复。最终候选在 Windows MySQL 5.7.44、8.0.45 分别通过 85、87 个叶子用例,0 失败、0 跳过;对应含父项记录为 95、97。已实际执行触发器、过程、函数和隔离事件。详见支持矩阵第九、十节及执行清单。 +- 复审结果:上述 Windows 隔离范围通过,不等于生产放行。只验证 InnoDB 数据快照,不承诺并发 DDL 一致性;非事务表和视图拒绝属于临时边界。官方导出文件恢复通过不证明自有导出保存了全部对象;其他 SQL 模式、定义者迁移、独立发行命令、Linux 实库、PostgreSQL 当前复测、SQLite 并发锁及正式服务验收仍未完成。 ## P0-06 建立统一领域模型 diff --git a/doc/构建版本与数据库支持矩阵.md b/doc/构建版本与数据库支持矩阵.md index c7775f3..b9f41cf 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 连接恢复、InnoDB 快照及 SQL 备份恢复 | `73df576`:77 项迁移、连接恢复、备份恢复、跨表快照和指定失败边界子测试通过 | 对象完整性、官方工具与独立发行命令、Linux 实库、Web 初始化和目标生产系统验证 | -| MySQL 8.0.45 | 正式生产支持目标 | 同上 | 同候选独立实库验证原有及新增场景,不复用 5.7 的结果 | 同上;不代表 8.0 全部补丁版本已经验证 | +| MySQL 5.7.44 | 历史兼容目标,仍保留实现 | 独立方言、迁移、连接恢复、InnoDB 快照、生成列备份及官方存储对象 SQL 恢复 | `e6e6719`:85 个叶子用例通过,含既有回归、特殊列双向互操作和存储对象恢复;详见第九、十节 | 自有导出的对象完整性、更多 SQL 模式、独立发行命令、Linux 实库、Web 初始化及生产系统验证 | +| MySQL 8.0.45 | 正式生产支持目标 | 同上,额外处理不可见列实际数据 | 同候选独立实库 87 个叶子用例通过,未复用 5.7 的结果 | 同上;不代表 8.0 全部补丁版本已经验证 | | PostgreSQL | 正式生产支持目标,实际服务端版本待本轮复核 | 独立方言、迁移 1~9、严格 TLS 和官方备份恢复工具接入 | 文件/嵌入/登记一致性、凭据/TLS 单元测试 | 当前版本真实集群、初始化、升级、失败回滚、备份恢复和业务回归 | 正式支持目标不等于已经生产放行。旧文档中的 PostgreSQL 实机记录仅作为线索,不替代当前候选版本复测。本批 MySQL 测试自行初始化 loopback 独立实例,不连接本机已有服务或生产数据库;PostgreSQL 当前候选实库测试未执行。 @@ -221,3 +221,81 @@ go test -json -p 1 -count=1 -timeout=8m -run '^TestMySQLReal' ./internal/databas 常规 `go test -count=1 ./...`、`go vet ./...`、`go mod verify` 通过。Linux CLI 测试包仅交叉编译成功,未作实库运行。最终复测创建 12 个隔离实例,连同复现和定向测试,本批目录共 18 个实例;全部正常退出,已记录端口无监听,初始化口令文件为空,共享 MySQL 进程不变。数据目录、随机测试密钥、日志和二进制均被忽略,不提交或分发。 剩余验收明确保留:触发器、生成列、例程、事件和视图等对象的完整性;官方工具互操作与独立发行 CLI;磁盘写满、同步失败和掉电等更广泛文件系统故障;Linux 实库、完整 Web 业务和服务部署;PostgreSQL、SQLite 剩余矩阵。本批不得替代这些证据,也不得据此关闭 P0-05 或全部 44 项目标。 + +## 九、生成列、不可见列与官方工具双向互操作 + +代码候选 `f260b22`,修改前检查点 `e9bc156`。正式测试为 `TestMySQLRealOfficialInteroperability`,共享调用代码位于 `backend/internal/testsupport/mysqltest/tools.go`,没有使用临时辅助验收脚本。 + +- 修复生成列被显式写入恢复语句,以及 `SELECT *` 遗漏不可见列的问题;只读取可写列,并保留只有生成列的表的实际行数。 +- 修复仅有生成列时扫描指针长度错误导致的越界。 +- 源数据、恢复数据以及表、列、索引的实际元数据分别核对;不以 `SHOW CREATE TABLE` 中等价的显式字符集写法差异误判结构变化。 +- 5.7.44 验证基础值、混合生成列和仅生成列表的双向互操作;8.0.45 额外验证不可见列的非默认实际值。 +- 官方工具从当前测试服务端的程序目录读取,检查版本系列;使用 `VERIFY_IDENTITY`,随机密码仅通过子进程环境传递。继承的 `MYSQL*` 环境和用户登录文件均隔离,未改写官方导出内容。 +- 本机两个版本的默认扩展插入导出,在仅生成列表上实证出现无效 SQL;正式测试明确使用 `--skip-extended-insert`,该选项下双向恢复通过,不把默认选项记为通过。 + +最终专项证据: + +| 实际版本 | 数据库包 | CLI 包 | 通过测试记录(含父项) | 叶子用例 | 失败 / 跳过 | +|---|---:|---:|---:|---:|---:| +| MySQL 5.7.44 | 47.670 秒 | 45.554 秒 | 90 | 81 | 0 / 0 | +| MySQL 8.0.45 | 54.469 秒 | 57.907 秒 | 92 | 83 | 0 / 0 | + +文件:`artifacts/mysql-pending-review-20260927/review-mysql57.jsonl`、`review-mysql80.jsonl`。这里明确区分父子测试记录总数与叶子用例,不把嵌套父项重复算成独立场景。后端常规测试、静态检查、模块校验通过;本批没有执行 Linux 实库或生产部署。 + +这只完成已列出的表和列类型的双向互操作,不能据此宣布视图、触发器、例程、事件、任意 SQL 模式及完整对象清单均受支持。P0-05 继续为 `[~]`。 + +## 十、官方存储对象 SQL 的分隔符恢复 + +修改前检查点 `6707059`,代码候选 `e6e6719`。本批处理的是官方导出文件到 Scert 恢复的方向,**没有把 Scert 自有导出改为完整存储对象备份**。 + +### 故障与修复 + +- 在隔离 MySQL 5.7.44 中实证:有效官方导出文件遇到 `DELIMITER` 时,旧恢复实现返回 1064。该指令用于客户端拆句,不应发送给数据库。 +- 解析器现在识别独立行上的分隔符切换,支持本批验证的 `;;`、`$$`、`//`;保留复合语句内部的分号、带引号的内容和可执行版本注释。 +- 支持 UTF-8 BOM、CRLF、大小写与前导空白。无效分隔符、未闭合引号或块注释返回错误,并且不返回可执行的部分语句。 +- 恢复仍使用单一数据库连接;数据库错误立即返回,不跳过错误、不提升权限、不切换连接重放。词法预检不等于完整 SQL 语义验证,也不宣称全部 DDL 可事务回滚。 + +### 正式测试范围 + +`TestMySQLRealOfficialStoredPrograms` 使用同版本的官方 `mysqldump --routines --events` 生成文件,文件未经改写,分别交给官方 `mysql` 和 Scert 恢复到全新隔离库。 + +1. 验证两个同表触发器的定义与执行顺序,插入新行后核对 `(4 + 2) * 3 = 18` 和中文标签。 +2. 验证存储过程、函数的定义、参数、返回类型、字符集、排序规则、定义者、SQL 模式和安全上下文;实际调用并核对结果。 +3. 验证禁用事件的定义、计划、时区及保留策略;仅在本测试实例中启用事件调度,并在目标库显式修改为两秒后的单次计划,检查实际执行且源库未变化。不是对生产数据库或机器共享实例开启调度。 +4. 使用没有对象管理权限的独立账户恢复同一文件,检查 1142、1227 或 1419 权限错误返回,且不继续恢复后面的例程。 +5. 无效分隔符出现在建表语句之后时,检查恢复拒绝整个词法输入,目标库仍无任何表。 + +每个版本运行 4 个新增叶子场景;常规单元测试另外覆盖分隔符、注释、转义、换行和无效输入。 + +### 权限和 SQL 模式边界 + +- 不改写 `DEFINER`,本批源库和两个恢复库使用同一隔离账户。跨账户、跨服务器定义者及跨库引用的迁移仍未验收。 +- 5.7 工具读取例程需要相应系统元数据权限,本夹具只在独立实例给测试账户授予 `mysql.proc` 读取权限。 +- 8.0 实例启用二进制日志时,函数创建实证返回 1419;本夹具只给该实例的专用测试账户授予所需 `SUPER`,没有启用 `log_bin_trust_function_creators`,也没有给实际业务账户扩权。 +- 本机 5.7 官方导出会移除对象 SQL 模式中的 `NO_AUTO_CREATE_USER`,官方恢复对照也出现同样变化。本批正式用例明确创建于 `STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION`,源、官方恢复及 Scert 恢复的元数据严格相等;不把默认模式或任意 SQL 模式记为通过。 +- `NO_BACKSLASH_ESCAPES` 等其他词法模式、恢复已启用事件时的调度隔离和对象安全语义,仍需独立验证。 + +### 复测结果与证据 + +在 `backend` 目录执行: + +```powershell +$env:SCERT_MYSQL_TEST_ROOT = 'D:\Desktop\Scert\artifacts\mysql-stored-programs-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-stored-programs-20260927/mysql57-review.jsonl' +# 将程序目录换为 E:\DB\8.0\bin,输出文件换为 mysql80-review.jsonl,再执行相同测试。 +``` + +| 实际版本 | 数据库包 | CLI 包 | 通过测试记录(含父项) | 叶子用例 | 失败 / 跳过 | +|---|---:|---:|---:|---:|---:| +| MySQL 5.7.44 | 45.980 秒 | 59.816 秒 | 95 | 85 | 0 / 0 | +| MySQL 8.0.45 | 60.495 秒 | 72.856 秒 | 97 | 87 | 0 / 0 | + +PowerShell 5.1 的 `Tee-Object` 文件使用 UTF-16,复核时用 `Get-Content -Encoding Unicode`。后端全量 `go test -count=1 ./...`、`go vet ./...`、`go mod verify` 通过;Linux CLI 测试包交叉编译通过但未运行,前端未修改、未重测。 + +本批复现、定向和全量测试共创建 22 个隔离实例,均已退出;全量测试记录的端口无监听,22 份初始化口令文件均为空,机器原有三个共享 MySQL 进程保持不变。数据、随机测试密钥、日志和编译文件仅留在忽略目录,没有提交。 + +### 尚未完成 + +Scert 自有导出仍需补齐触发器、例程、事件及视图,验证可见权限与完整对象清单,防止对象遗漏;本批导入能力不能证明导出完整。独立发行 CLI、Linux 实库、完整 Web 业务、服务重启和正式生产部署仍未验收。PostgreSQL、SQLite 和全部 44 项整改范围不变,P0-05 保持 `[~]`。