Smail/docs/SQL复制中断恢复补充验收.md
smail dd2038dc7f
Some checks are pending
Security Checks / security (push) Waiting to run
补齐双SQL复制中断实机验收与恢复证据
2026-09-21 23:13:33 +08:00

79 lines
6.7 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.

# SQL 复制中断恢复补充验收
## 范围与放行边界
本轮补充 MySQL、PostgreSQL 同引擎迁移的未提交复制中断验收。只操作随机隔离数据库和本轮 Smail 测试进程,不停止共享数据库,不替换 `/opt/smail` 正式程序,不修改 DNS 或正式证书。
本记录不覆盖事务提交瞬间、配置落盘切换临界点、跨引擎复制中断、真实浏览器、外部投递、自动续期、长时容量或异机灾备。未关闭项目仍是生产放行门禁,不能将本项通过扩大为全项目可部署。
## 构建与隔离条件
- 源码基线:`8dc040a9ab14c32efea33c8ceedfd441d739a457`,修改前已提交并推送。
- 最新后端重新编译:Linux amd64、CGO 关闭、内置插件模式。
- 应用摘要:`468c0ce4dd6555d58c8cb79a920c9a0e9008e41e8d7894d4704d6f212036d761`。
- 709 份输入文件记录摘要,包括后端源码、模块文件及实际嵌入资源。前端和 Linux 插件资源复用并核对摘要,不宣称本轮完整发行包重新构建。
- 应用硬内存上限 192 MiB、Go 内存目标 128 MiB、单线程运行、CPU 配额 25%,测试单元禁止交换。
- 每轮使用全新源库、未创建的正常迁移目标和独立中断目标;账号随机且权限仅限验收所需。PostgreSQL 建库权限临时授予,结束后撤销。
- 保留离线源库与失败目标作为证据,不删除任何文件或数据库;正常运行只连接一个业务库,配置历史与业务同库。
## 中断证据要求
1. 通过非特权身份在隔离源库补充 1,024 条邮件,每条正文 16 KiB,保留原始邮件及表结构。
2. 通过正式迁移 API 发起复制,不给应用增加 HTTP 故障注入入口或改变迁移行为。
3. MySQL 按唯一测试账号和库过滤活动事务,要求修改行数大于 128;PostgreSQL 同时检查事务号、未结束事务、邮件表写锁和实际分配的数据页。
4. 仅冻结与当前隔离目录程序 inode 匹配的测试单元,再次验证事务仍存在,独立连接读取目标邮件和配置历史均为零行,活动配置仍指向源。
5. SIGKILL 后确认进程退出信号为 9、目标连接归零、事务回滚、源库全表数据摘要及配置文件摘要保持一致。
6. 重启恢复后验证登录、历史邮件正文及附件、新邮件 SMTP 收取和 IMAP/POP3 读取;失败目标预检必须返回 HTTP 409 且结构化错误码为 `DATABASE_MIGRATION_TARGET_EXISTS`,其逻辑内容不得被覆盖。
7. 随后使用另一个未占用目标完成正常迁移、内部重启、进程重启、目标账号故障拒绝启动及恢复;确认源库无活动连接、新邮件只在活动目标、配置历史完整保留。
连接断开、空目标存在、普通重启、任意 HTTP 409 都不能单独视为通过。数据库服务器不在 SIGSTOP/SIGKILL 范围内。
## 本地测试与保留的失败
新增九项工具回归,覆盖正式路径拒绝、同引擎限制、非破坏性种子、标识校验、事务观察过滤、已提交及缺失事务反例、正常响应不能冒充中断、创建失败仍锁定账号并保留结果。
Windows 运行时工具回归 90 项通过。Windows 全部署套件发现 121 个测试条目,结果为两项断言失败和两个加载错误:Linux 证书工具依赖 `fcntl`,另外两个用例依赖 Linux 路径格式。失败原始日志保存在 `sql-interruption-deployment-windows.log`,不计为通过,也不通过忽略异常来消除失败。
## 实机结果与复审
两轮使用同一最新后端候选,实际退出码均为零:
| 取证项 | MySQL | PostgreSQL |
| --- | --- | --- |
| 隔离实例编号 | `20260921-222939` | `20260921-223902` |
| 未提交事务数 | 1 | 1 |
| 事务修改行数 | 190 | 不使用此指标 |
| 邮件表物理页字节数 | 不使用此指标 | 57,344 |
| 独立查询的已提交邮件/配置历史行数 | 0/0 | 0/0 |
| 中断前 PID | 840882 | 842979 |
| 中断后恢复 PID | 841717 | 843862 |
| 中断退出信号 | 9 | 9 |
| 后续迁移源/目标配置历史记录数 | 1/1,完整行一致 | 1/1,完整行一致 |
| 正常迁移后三阶段源连接数 | 均为 0 | 均为 0 |
| 运行目录中的 SQLite 文件数 | 0 | 0 |
| 采集到的应用内存峰值字节数 | 142,495,744 | 142,200,832 |
| OOM/交换峰值/收尾错误 | 均为 0 | 均为 0 |
内存峰值为最终采集时的 systemd 单元资源值,不据此宣称覆盖全部进程重启前的历史峰值。全表数据摘要不替代物理页快照、序列状态或断电耐久性验证。中断恢复邮件探针复用了普通迁移验证器,其中 `mail.new_mail_only_in_target` 的目标参数是恢复后的活动源库,不是中断残留库。
云端完整 Linux 部署工具回归在 `/var/tmp/smail-review-python-20260921-224608/` 执行:160 项、零跳过、零失败,测试耗时 24.709 秒。日志 `python-linux-tests-20260921-224608.log` 的 SHA-256 为 `73303ae1ef525cf297f667a256fcc4c70b051b9bfb7725feb5be12f43e37ae0f`。其中证书相关用例是隔离工具回归,不是真实 DNS/ACME 续期验收。
- `[✓]` MySQL、PostgreSQL 实机复制中断、恢复和后续正常迁移完成并复审通过。
- `[✓]` 完整 Linux 部署工具回归 160 项通过,零跳过。
- `[✓]` 本地与远端证据、服务状态、数据库账号和资源清理独立复核通过。
- `[ ]` 事务提交、配置切换临界点及最终统一发行候选验收。
证据根目录为 `test-log/production-remediation-20260921/`:
- 构建:`sql-interruption-build-manifest.json`、`sql-interruption-source-manifest.json`。
- MySQL 汇总:`sql-interruption-results-20260921-222924.json`。
- PostgreSQL 汇总:`sql-interruption-results-20260921-223851.json`。
- 实机原始证据:`sql-interruption-runtime-evidence/` 下两个对应编号目录,各 20 份文件。
- 本地回归:`sql-interruption-tool-tests-verified.log`。
- Linux 回归:`python-linux-result-20260921-224608.json` 及上述原始日志。
- 独立复审:`sql-interruption-final-recheck.json`。
北京时间 2026 年 9 月 21 日 22:56,独立复核 40 份实机证据、两份部署程序副本及两组八个工具的本地/远端摘要一致;709 份构建输入(含 619 份 Go 源文件)没有漂移。六个测试 SQL 账号全部锁定,PostgreSQL 三个账号均无建库权限,两轮测试库连接均归零,各十个应用/探针/网络单元停止,Linux 部署工具单元也已停止。正式六服务的 PID、InvocationID 和重启计数未变,正式程序摘要仍为 `c14ef1c5ba1dc2096c312c8357039a7330c985cbeac90765aed01d8151e05e1f`。用户原有 `云端全项目测试报告.md` 没有编辑或暂存。
测试账号密码、协议凭据和会话值不进入本记录。