同步SQLite历史升级验证文档与运维边界

补齐支持矩阵第十七节、生产运维升级恢复说明和P0-05规格,同步任务清单、审查记录及当前测试证据。
This commit is contained in:
xuans 2026-09-28 02:06:12 +08:00
parent fd2810bf03
commit 68bf94fd46
7 changed files with 76 additions and 6 deletions

View File

@ -2,7 +2,7 @@
> 2026-09-27 任务规格:完整 44 项及六阶段验收规范见《整改任务规格与验收约定》和《Scert整改任务执行清单》。以下历史勾选不替代当前整改状态,不把旧测试结果当成新增需求已经实现。
> 当前进度(源码 `6db5d7b`):P0-05 `[~]`。已修复 SQLite 异常退出后旧 WAL 覆盖恢复数据的问题,并补充当前业务表、资源关联、密码、加密凭据和证书的冷备份恢复验证。SQLite 专项通过 55 个叶子用例;新增 13 个恢复用例连续 5 次竞态检测通过,详见《构建版本与数据库支持矩阵》第十六节。第十四、十五节保留此前 MySQL 和 SQLite 并发证据。历史业务升级、独立发行命令、真实服务重启、取消边界及其余数据库/平台和生产门禁仍未完成,全部 44 项范围不变。
> 当前进度(源码 `fd2810b`):P0-05 `[~]`。已复现并修复 SQLite 历史模式 1~3 有任务数据时升级到迁移 4 失败的问题;模式 1~9 的带数据升级、依赖对象保留及失败重试已有回归。本批干净提交构建的独立 Windows 程序完成历史模式 3 备份、升级、恢复后再次升级,以及升级后备份恢复。SQLite 专项通过 71 个叶子用例,27 个升级/恢复用例连续 3 次竞态检测通过,详见《构建版本与数据库支持矩阵》第十七节。旧发行包真实数据迁移、完整发行包安装、真实服务重启、Linux 原生执行、取消边界及其余数据库和生产门禁仍未完成;全部 44 项范围不变。
> 2026-09-27 范围调整:本文件保留早期开发历史,当前执行以《Scert整改合并优化清单》和《Scert整改任务执行清单》为准。正式交付仅为 Web 和 Windows/Linux 服务端;本文件中的 Wails 桌面窗口、托盘、桌面更新、桌面配置和桌面 UI 测试均退出正式开发及验收范围,不再作为未完成交付项。CLI 限定为初始化及服务运维,不另建业务管理界面。

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 | [~] | 确认数据库正式支持矩阵 | 保留既有 MySQL/SQLite 证据;修复异常退出 WAL 覆盖恢复数据,补充当前业务数据、凭据与证书冷恢复 | 继续历史业务升级、独立发行命令、真实服务重启和取消边界;其余数据库/平台及生产门禁不缩减 | `6db5d7b` SQLite 专项 55 个叶子用例通过;新增 13 个用例连续 5 次竞态检测通过;详见支持矩阵第十六节 |
| P0-05 | [~] | 确认数据库正式支持矩阵 | 保留 MySQL/SQLite 既有证据;修复历史模式带数据升级,增加事务回滚和独立 Windows 程序备份恢复 | 继续旧发行包实际数据升级、完整发行包、真实服务重启、Linux 原生和取消边界;其余数据库及生产门禁不缩减 | `fd2810b` SQLite 专项 71 个叶子用例;27 个升级/恢复用例连续 3 次竞态检测通过;支持矩阵第十七节 |
| P0-06 | [~] | 建立统一领域模型 | 已有域名、证书、任务、服务器等实体,项目和部署关联仍需审查 | 补齐资源关系图、外键/归属和任务关联 | 模型文档、迁移检查、接口测试 |
| P0-07 | [~] | 增加项目级权限和资源隔离 | 用户组和角色已有实现,项目级资源边界未闭环 | 为证书、DNS、服务器、任务和审计补齐项目归属及越权测试 | 权限矩阵、接口越权测试 |
| P0-08 | [~] | 完善凭据和主密钥生命周期 | 已有凭据存储与测试,轮换、恢复、删除和失效证据不完整 | 补齐创建、轮换、恢复、删除、脱敏和不可恢复边界 | 安全测试、日志审查、恢复演练 |
@ -403,9 +403,20 @@ P0-05 从 `[!]` 调整为 `[~]`,并未标记完成;P0-04 剩余门禁和全
### P0-05 SQLite 异常退出及业务恢复(源码 `6db5d7b`)
本节为上一批记录,当前历史模式升级及独立 Windows 程序证据见下节;未完成项按当前证据区分,不覆盖历史结果。
- `[x]` 修改前检查点 `5e5abf2` 已推送;子进程提交 WAL 后不关闭数据库直接退出,复现恢复返回成功但数据仍为旧值,保留 `wal-before.jsonl`。
- `[x]` 服务维护锁内由 SQLite 合并日志并切换到 DELETE 模式,关闭连接后确认 WAL/SHM/回滚日志不存在;占用、孤立日志及非普通路径均拒绝恢复,不手动删除日志。
- `[x]` 成功恢复和证书资产失败回滚均核对原有已提交 WAL 数据进入恢复前快照;不再依赖残留 WAL 偶然恢复原数据。
- `[x]` 通过正式备份/恢复命令处理器验证当前全部业务表及模式、迁移记录、自增序列、资源关联、用户密码和分组、DNS 归属、加密凭据、真实证书/私钥与重复恢复。
- `[x]` SQLite 专项 55 个叶子用例、恢复专项 13 个用例连续 5 次竞态检测通过;后端全量 1368 条叶子通过记录,0 失败、43 项条件跳过,vet/模块校验及 Linux CLI 测试包交叉编译通过。
- `[ ]` 带历史业务数据的跨版本升级、独立发行二进制命令、真实服务重启、Linux 原生运行、断电/磁盘故障、取消边界及其余数据库/平台与生产门禁;本批不调用外部 DNS、SSH 或邮件服务,全部 44 项范围不变。
### P0-05 SQLite 历史模式升级及独立程序(源码 `fd2810b`)
- `[x]` 修改前检查点 `0e16d28` 已推送;模式 1、2、3 写入历史任务后均复现迁移 4 失败,保留 `upgrade-before.jsonl`。
- `[x]` 固定物理连接,在同一事务内重建任务表并记录版本;保留原始业务列、行号、索引、依赖视图和触发器,外键检查通过后提交,恢复连接原外键设置。
- `[x]` 模式 1~9 的代表性数据升级及重复执行;外键开关、生成列、级联关联、依赖对象、版本记录失败、临时名称冲突和外键冲突后的回滚重试均通过。
- `[x]` 干净提交构建的独立 `scert.exe` 实际执行历史模式 3 备份、正式应用入口升级、旧备份恢复后再升级,以及升级后备份恢复;核对完整表/模式、资源绑定、用户密码、加密凭据及证书。
- `[x]` SQLite 专项 71 个叶子用例,27 个升级/恢复用例连续 3 次竞态检测;后端全量、静态/模块检查和 Linux 测试包交叉编译通过,证据见支持矩阵第十七节。
- `[ ]` 旧发行包产生的实际历史数据与配置升级、完整发行包安装、真实服务重启、Linux 原生执行、取消边界及其余数据库/平台和生产门禁。历史模式由现有迁移文件构造,不冒充旧发行二进制运行证据;全部 44 项范围不变。

View File

@ -8,7 +8,7 @@
> 进度同步:2026 年 9 月 27 日。任务状态与《Scert整改任务执行清单.md》及四份分级任务规格保持一致;本文件的需求和验收标准不因状态更新而缩减。详细变更、验证命令、证据和剩余缺口见执行清单与对应专项记录,`[~]` 仅表示已有实现或正在整改,不表示整项完成。
> 当前专项:P0-05 已修复 SQLite 异常退出后残留 WAL 导致“恢复成功但仍读到旧数据”的问题,并验证恢复前快照保留已提交 WAL 内容、资产失败回滚和外部事务占用保护。源码 `6db5d7b` 的 SQLite 专项通过 55 个叶子用例,新增 13 个恢复用例连续 5 次竞态检测通过;当前业务数据、资源关联、凭据和证书恢复证据见支持矩阵第十六节。历史业务升级、独立发行命令、真实服务重启、取消边界及其余数据库/平台和生产门禁仍待完成,P0-05 保持 `[~]`,全部 44 项范围不变。
> 当前专项:P0-05 已修复 SQLite 历史模式 1~3 存在任务数据时迁移 4 失败的问题,并验证模式 1~9 的带数据升级、依赖对象保留及失败回滚重试。源码 `fd2810b` 的 SQLite 专项通过 71 个叶子用例,27 个升级/恢复用例连续 3 次竞态检测通过;干净提交构建的独立 Windows 程序完成历史模式备份、升级及恢复后再升级,证据见支持矩阵第十七节。此前 WAL 恢复证据保留在第十六节。旧发行包真实数据迁移、完整发行包安装、真实服务重启、Linux 原生执行、取消边界及其余数据库和生产门禁仍待完成;P0-05 保持 `[~]`,全部 44 项范围不变。
---

View File

@ -2,7 +2,7 @@
> 2026-09-27 证据索引:当前 44 项整改的逐项范围、命令、实机步骤和复审字段见《整改任务规格与验收约定》及四份分级规格;实际进展以《Scert整改任务执行清单》为准。本文历史结果须按当时源码与环境解释。
> 本批进度(源码 `6db5d7b`):P0-05 `[~]`。先复现异常退出后的旧 WAL 覆盖恢复数据,再修复恢复前日志合并、模式切换和安全预检;新增业务关联、凭据、证书、重复恢复及失败保护回归。SQLite 专项通过 55 个叶子用例;新增 13 个用例连续 5 次竞态检测通过。后端全量 1368 条叶子通过记录、含父项 1489 条,0 失败,43 项条件跳过;vet、模块校验及 Linux CLI 测试包交叉编译通过。证据见支持矩阵第十六节,前两批证据保留在第十四、十五节;没有执行 Linux 实机、独立发行命令、前端或生产验收。
> 本批进度(源码 `fd2810b`):P0-05 `[~]`。修复 SQLite 历史模式带任务数据升级时的非固定默认值加列失败,保留业务数据、索引、视图、触发器和外键关联,并验证失败回滚及重试。SQLite 专项 71 个叶子用例通过,27 个升级/恢复用例连续 3 次竞态检测通过。后端全量 1384 条叶子通过记录、含父项 1509 条,0 失败、43 项条件跳过;vet、模块校验及 Linux 数据库/CLI 测试包交叉编译通过。独立 Windows 产品程序实际执行历史模式备份、升级和恢复;证据见支持矩阵第十七节。不是旧发行包实际数据升级、完整发行包安装、真实服务重启、Linux 原生运行或生产验收。
> 2026-09-27 范围调整:以下为历史审查证据。当前正式测试范围仅为 Web 和 Windows/Linux 服务端;历史桌面模块测试记录保留,但不再作为交付目标或生产门禁。当前任务状态见《Scert整改任务执行清单》。

View File

@ -63,10 +63,12 @@
- 任务编号:P0-05;任务名称:确认数据库正式支持矩阵;优先级:P0。
- 当前状态:`[~] 进行中`。
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[!]`;最终验收 `[ ]`。
- 问题说明:已修复迁移、连接恢复、备份会话、MySQL 对象导出/恢复及 SQLite 逐连接配置与短截止时间等待;本批修复异常退出后的旧 WAL 覆盖恢复数据,补充当前业务关联、凭据与证书冷恢复。历史业务升级、独立发行命令、真实服务重启、取消边界及剩余三库/双平台证据仍不足。
- 问题说明:已修复迁移、连接恢复、MySQL 对象导出/恢复、SQLite 逐连接配置与 WAL 恢复;本批修复历史模式 1~3 有任务数据时迁移 4 失败,并补充独立 Windows 程序的升级及备份恢复。旧发行包实际数据升级、完整发行包、真实服务重启、Linux 原生、取消边界及剩余数据库/平台证据仍不足。
- 涉及文件:`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 锁并发;逐库检查类型、索引、默认值、事务及初始化、升级、回滚、备份恢复。不能悄然去掉难测版本。
- 当前新增证据:SQLite 历史模式 1~9 的带数据升级、任务表依赖对象保留、失败回滚与解除阻塞后重试已完成;独立 Windows 产品程序的旧备份升级、恢复后再升级和升级后备份恢复已完成,详见《构建版本与数据库支持矩阵》第十七节。
- 当前剩余门禁:旧发行包实际数据与配置、完整发行包安装、真实服务重启、Linux 原生执行、取消边界、其余数据库/平台和生产门禁仍未完成;隔离模式夹具和交叉编译不替代这些证据。
- 验证命令:V06、V02;真实数据库测试按正式集成测试的参数运行并保存非跳过结果,不在命令行嵌入密码。
- 实机验收步骤:逐版本创建专用测试库;从空库初始化及历史版本迁移,注入失败检查事务;使用官方备份工具恢复并核对行数、资源关联和加密凭据;验证 TLS 和断线重连;只清理明确测试库。
- 验收证据:源码 `777c716` 在 Windows MySQL 5.7.44、8.0.45 完整专项分别通过 176、202 个叶子用例,0 失败、0 跳过;含父项记录为 201、227。新增视图与完整清单权限、复杂依赖、原始官方文件恢复及失败保护;详见支持矩阵第十四节,之前批次的例程、事件等证据保留追溯。
@ -127,6 +129,7 @@
## P0-06 建立统一领域模型
- 任务编号:P0-06;任务名称:建立统一领域模型;优先级:P0。
- 当前状态:`[~] 进行中`。
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。

View File

@ -55,7 +55,7 @@ npm.cmd run build
| 数据库 | 预期定位 | 代码现状 | 本轮验证 | 尚未满足的正式验收 |
|---|---|---|---|---|
| SQLite | 单机、开发、轻量部署 | 驱动、初始化、迁移 1~9、CLI 备份恢复、逐连接配置、截止时间等待预算及恢复前日志处理 | 保留迁移/并发证据;修复异常退出 WAL 覆盖恢复数据,验证当前业务样本、凭据及证书恢复,专项 55 个叶子用例通过,见第十六节 | 取消边界、带业务数据的历史升级、独立发行命令、Linux 实机、真实服务重启及生产门禁 |
| SQLite | 单机、开发、轻量部署 | 驱动、初始化、迁移 1~9、CLI 备份恢复、逐连接配置、截止时间等待预算及恢复前日志处理 | 保留迁移/并发证据;修复异常退出 WAL 覆盖恢复数据及历史任务数据升级失败,验证当前业务样本、历史模式升级、凭据及证书恢复,专项 71 个叶子用例通过,见第十六、十七节 | 取消边界、旧发行包实际数据、完整发行包、Linux 原生、真实服务重启及生产门禁 |
| MySQL 5.7.44 | 历史兼容目标,仍保留实现 | 独立方言、迁移、连接恢复、InnoDB 快照、特殊列、自有触发器/例程/事件/视图、完整清单权限及受限官方恢复 | `777c716` 完整专项 176 个叶子用例通过,详见第十四节 | 更多编码与 SQL 模式、并发 DDL/授权变化、定义者迁移、独立发行命令、Linux 实库、Web 初始化及生产系统验证 |
| MySQL 8.0.45 | 正式生产支持目标 | 同上,额外处理不可见列实际数据、启用角色与部分撤销 | 同候选独立实库 202 个叶子用例通过,未复用 5.7 的结果;详见第十四节 | 同上;不代表 8.0 全部补丁版本已经验证 |
| PostgreSQL | 正式生产支持目标,实际服务端版本待本轮复核 | 独立方言、迁移 1~9、严格 TLS 和官方备份恢复工具接入 | 文件/嵌入/登记一致性、凭据/TLS 单元测试 | 当前版本真实集群、初始化、升级、失败回滚、备份恢复和业务回归 |
@ -621,3 +621,51 @@ go test -json -count=1 -timeout=8m ./...
- `[ ]` 取消边界、其余数据库/平台、Web/外部服务与生产门禁继续保留;维护锁不能阻止外部程序在预检之后重新访问数据库,整个恢复期间仍须停止所有外部访问。
P0-05 保持 `[~]`,全部 44 项范围不变;本批修复和回归不作为生产放行结论。
## 十七、SQLite 历史业务数据升级及独立程序恢复
本批日期:2026 年 9 月 28 日(本机时间)。修改前检查点 `0e16d28`,正式源码 `fd2810bf03f4e4f7b4dd25f36d28848aca185d22`,均已推送。测试使用 Windows 本机临时 SQLite 文件库和临时工作目录,没有操作生产服务、生产数据库、真实 DNS、SSH 或邮件服务。
### 缺陷复现与产品修复
原迁移 4 直接向已有数据的 `tasks` 表添加 `NOT NULL DEFAULT CURRENT_TIMESTAMP` 列。SQLite 对非空表不接受该非固定默认值,历史模式 1、2、3 只要存在任务数据就会升级失败;旧测试只覆盖空表,未发现该缺陷。失败证据保留在 `artifacts/sqlite-upgrade-20260928/upgrade-before.jsonl`,该目录由 Git 忽略。
产品由 `migrate.go` 在 SQLite 迁移 4 中调用 `sqlite_task_migration.go`:固定物理连接,临时保存并关闭该连接的外键检查;在同一事务中读取原表定义,使用不冲突的临时表重建 `tasks`,保留原有业务列、行号、索引、视图、触发器、生成列和外键关联;完成 `PRAGMA foreign_key_check` 后记录迁移版本并提交。失败时整体回滚,临时表冲突、版本登记拒绝和外键冲突均不会覆盖原数据;排除阻塞后可再次迁移。事务完成后恢复原连接外键设置,恢复失败则不复用状态未知的连接。没有修改原迁移 SQL,也没有使用 `writable_schema`。
### 历史模式和依赖对象回归
- 模式 1~9 分别写入该模式支持的代表性业务数据后升级,连续执行两次,核对原字段内容、关联、历史时间和新任务默认时间。
- 覆盖外键开关、额外列、虚拟生成列、显式行号、中文命名唯一索引、级联子表、任务表触发器、外部引用触发器、依赖视图及视图上的 `INSTEAD OF` 触发器。
- 覆盖迁移版本登记失败、临时表名称冲突和外键冲突;失败后模式、数据、迁移历史和连接设置保持不变,解除阻塞后重试成功。
- 这些历史模式由当前仓库迁移文件构造,不等同于旧发行二进制实际运行产生的数据;不承诺任意第三方改造的 SQLite 模式均可升级。
### 独立 Windows 产品程序恢复
使用干净提交构建的独立 `scert.exe`,通过正式应用入口执行两条恢复路径:
1. 模式 3 旧备份恢复后再次由产品程序触发升级。
2. 升级完成后的备份恢复到新工作目录。
测试在恢复前修改任务、删除部署绑定、破坏证书并变更加密凭据,核对恢复后的表结构、业务数据、迁移记录、自增序列、任务绑定、用户密码摘要、加密凭据和证书配对。子进程使用临时目录和超时,剔除继承的 `SCERT_*` 环境变量,输出不包含随机凭据或密码;未创建辅助验收脚本。该程序是干净源码构建的独立产品程序,不是完整发行包安装证据。
### 最终验证证据
| 检查 | 证据或命令 | 实际结果 |
|---|---|---|
| SQLite 专项 | `sqlite-final.jsonl`,`go test -json -count=1 -timeout=3m -run '^TestSQLite' ./internal/database ./internal/cli` | 71 个叶子用例、含父项 86 条通过,2 个包,0 失败、0 跳过 |
| 后端全量 | `backend-final.jsonl`,`go test -json -count=1 -timeout=8m ./...` | 1384 个叶子用例、含父项 1509 条通过,0 失败、43 项条件跳过 |
| 重复竞态 | `upgrade-race.jsonl`,`go test -race -json -count=3 -timeout=5m -run '^TestSQLite(BusinessUpgrade|BusinessRestore|Restore)' ./internal/database ./internal/cli` | 27 个不同叶子用例各执行 3 次,81 个叶子、含父项 102 条通过,0 失败、0 跳过 |
| 静态与模块 | `go vet ./...`、`go mod verify` | 退出码 0,模块校验通过 |
| 独立产品程序 | `TestSQLiteBusinessUpgradeStandaloneCLI` | 干净提交构建的 Windows amd64 程序完成旧备份升级、恢复后再升级及升级后备份恢复 |
| Linux 目标验证 | `GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go test -c` | 数据库和 CLI 测试包交叉编译通过;没有在 Linux 主机执行 |
干净提交构建程序信息:`Go go1.26.6`、`windows/amd64`、`CGO_ENABLED=1`、`vcs.revision=fd2810bf03f4e4f7b4dd25f36d28848aca185d22`、`vcs.modified=false`,SHA-256 为 `F22736221E79E92928E86EB1EFC48F21994914C937CF9865FB1C4A691E36BD8B`。该文件不是完整发行包。
### 剩余边界与任务状态
- `[x]` 历史模式 1~9 带业务数据升级、依赖对象保留、失败回滚和排除阻塞后重试完成。
- `[x]` 独立 Windows 产品程序的两条备份恢复路径完成,测试未使用辅助验收脚本。
- `[ ]` 旧发行包实际产生的数据和配置、完整发行包安装、真实服务重启、Linux 原生执行、断电/磁盘故障及取消边界。
- `[ ]` PostgreSQL 当前实库、MySQL 剩余门禁、Web/外部服务、双平台生产门禁和真实生产验收;交叉编译、隔离夹具和独立程序不能替代上述证据。
P0-05 保持 `[~]`,全部 44 项范围不变;本节只记录当前局部修复和回归,不构成生产放行结论。

View File

@ -309,6 +309,14 @@ sudo systemctl start Scert
备份目录必须保持 `0700`,并复制到加密、离线或不可变存储。`manifest.json` 不是数字签名,不能替代备份介质权限、异地副本和访问审计。
### 7.3 SQLite 历史模式升级与恢复
升级前必须停止 Scert 服务,保留一份经过清单和 SHA-256 校验的有效备份,并确认目标数据库、配置目录和证书目录均属于本次维护范围。不要直接用旧发行包覆盖生产数据库;先在隔离副本上使用目标版本执行升级,核对迁移历史、业务表、关联、索引、视图、触发器、凭据和证书配对,再安排生产窗口。
SQLite 历史模式在迁移 4 需要为已有任务数据增加时间列时,程序会在固定连接和单一事务中重建任务表,保留已验证的业务列及依赖对象,提交前执行外键检查。临时关闭的外键检查只作用于该迁移连接和该事务,事务结束后恢复原设置,不是全局永久关闭。临时表冲突、外键冲突或版本登记失败时必须整体回滚;排除具体阻塞后才允许重试,不得手工删除表、日志或修改 `sqlite_master`。
当前回归覆盖仓库迁移文件构造的模式 1~9、代表性业务数据、生成列、索引、视图、触发器和外键关联;不承诺任意第三方改造模式、旧发行包实际数据、断电损坏或磁盘故障均可自动升级。交叉编译和 Windows 隔离测试不能替代 Linux 原生运行、真实服务重启或生产数据库验收。
## 8. 恢复
恢复前先复制当前完整数据目录和证书目录到受保护位置,然后执行: