Smail/docs/SQLite复制中断恢复补充验收.md
smail d8b5a5fb23
Some checks are pending
Security Checks / security (push) Waiting to run
补齐SQLite复制中断恢复及云端部署验收
2026-09-21 06:27:57 +08:00

65 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SQLite 复制中断恢复补充验收
## 结论和范围
北京时间 2026 年 9 月 21 日,云端隔离实例完成 SQLite 未提交复制事务中的真实进程中断恢复。随后在同一实例完成正常迁移、内部重启、系统级进程重启和目标权限故障恢复。本项复审通过,但不代表整个项目达到生产放行条件。
- `[✓]` 复制事务未提交时发送 SIGKILL,源库和活动配置保持不变。
- `[✓]` 恢复后登录、历史邮件正文及附件、新邮件 SMTP 收取及 IMAP/POP3 读取通过。
- `[✓]` 再使用中断目标返回 HTTP 409 和结构化错误码,失败目标及日志文件未被覆盖。
- `[✓]` 后续正常迁移只保留一个活动业务库,配置历史与业务同库。
- `[✓]` 扩充部署套件实际执行 131 项,零跳过、零失败。
- `[ ]` 提交临界点、配置切换临界点、MySQL/PostgreSQL 复制中断及跨引擎迁移矩阵。
## 实例、候选和取证
成功实例:`/var/tmp/smail-review-runtime-20260921-061711/`。
本地归档:`test-log/production-remediation-20260921/interruption-runtime-evidence/smail-review-runtime-20260921-061711/`。
驱动汇总:`interruption-runtime-result-20260921-061701.json`。
候选程序沿用此前重新编译的 `smail-sql-migration`,SHA-256 为 `6b700120e8bc0b6ca1ce723d0319852259d4aa983646bbc69c4c2fe73e88309d`,源码标识为 `375ffcabfea607690ea89e31b72cc346cfc122f3`。本轮只修改验收工具和测试,不宣称重新构建应用或前端。
`interruption-recheck-20260921-062557.json` 再次核对 610 个后端 Go 源文件、四个本地与远端工具以及 20 份下载证据的摘要。工具清单对应本轮中断支持版本,不套用旧 SQL 验收工具摘要。
## 中断点与恢复断言
以非特权应用身份在隔离源库写入 1,024 条夹具邮件,每条正文 16 KiB;源库大小 17,645,568 字节。通过正式迁移 API 发起复制,检测目标文件和回滚日志后冻结本轮应用进程,确认活动配置仍指向源库且事务未提交,再保存快照并终止进程。
| 取证项 | 实际值 |
| --- | --- |
| 中断进程 PID | 779623 |
| 目标文件大小 | 2,650,112 字节 |
| 回滚日志大小 | 38,400 字节 |
| 目标读取被锁定 | 是 |
| 源库写锁仍被持有 | 是 |
| 已提交目标邮件行数 | 未能查询,结果为 `null`,不是查询得到零行 |
| 终止结果 | MainPID 为零,退出信号 9 |
| 恢复后 PID | 779737 |
| 后续系统重启 PID | 779864 |
| 目标权限故障恢复 PID | 779902 |
中断前后源库完整逻辑摘要及活动配置文件摘要一致。恢复后拒绝复用失败目标,要求 `data.code=DATABASE_MIGRATION_TARGET_EXISTS`,不能把任意 HTTP 409 当作通过。失败目标及 journal 的字节摘要在恢复探针前后保持一致。
权限为 `0700` 的中断快照目录保留原始证据:
- `interrupted.db`:`3bb4c0c1571b9c28a38ce02f6a4dd59982a0f036765f404e8123284790d30369`。
- `interrupted.db-journal`:`4dda08e81d6a036d7f3e4f09040809f4e057845e3276e1472d921f1861fe2c05`。
最终活动库仅 `migrated.db`。`smail.db`、`occupied.db`、`interrupted.db` 是保留的离线源库和失败目标,不是额外活动库。配置历史源、目标各一条,完整行一致。应用内存峰值 76,910,592 字节、交换为零,OOM、资源采集错误、收尾错误均为零。
## 保留的失败记录
1. `060953`:夹具先停止瞬时服务,导致单元被回收,无法再次启动。改为通过非特权探针在独占事务中准备隔离源库,不停止瞬时服务。
2. `061252`:已完成真实中断和源库不变验证,但恢复探针错误地把响应 `data` 当作字符串。修正为检查结构化错误码,并增加错误形状反例;没有降低 HTTP 状态和错误码要求。
3. `061711`:完整中断恢复及后续正常迁移全部通过。前两次失败证据仍保留,不计作完整通过。
## 扩充部署套件和保护检查
本轮新增六项中断工具测试。2026 年 9 月 21 日 06:23 的完整云端套件在 `/var/tmp/smail-review-python-20260921-062339/` 执行,实际 131 项、零跳过、退出零,测试耗时 6.501 秒,单元运行约 7.367 秒,内存峰值 46.3 MiB,交换为零。
本地日志 `python-linux-tests-20260921-062339.log` 的 SHA-256:`5ede614792bb83bb260992295720f5d1423a57cf13f87b7d715d9b1352a734d5`。隔离策略保持不变,仅沿用已经验证的边界内 `CAP_SETUID` 显式传递。
06:25 再次确认六个保护服务的 PID、InvocationID 和重启计数与实机验收前一致,无运行中的验收单元。正式程序 SHA-256 仍为 `c14ef1c5ba1dc2096c312c8357039a7330c985cbeac90765aed01d8151e05e1f`。未改动用户原有全项目报告,未删除数据库、快照或其他项目文件。
本记录不覆盖真实浏览器、历史凭据撤销、全部静态告警、真实 DNS 自动续期与全协议换证、外部邮件最终收件、长时容量和异机灾备。上述门禁不得随本次提交自动改为通过。