65 lines
5.0 KiB
Markdown
65 lines
5.0 KiB
Markdown
# 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 自动续期与全协议换证、外部邮件最终收件、长时容量和异机灾备。上述门禁不得随本次提交自动改为通过。
|