79 lines
6.7 KiB
Markdown
79 lines
6.7 KiB
Markdown
# 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` 没有编辑或暂存。
|
||
|
||
测试账号密码、协议凭据和会话值不进入本记录。
|