feat(cost-exceptions): 支持 --days=0 一次性归档

一次性清理需要「不按时间过滤」的语义,但 CLI 把 days 下限钳在 1:
本地库的 15.2 万条 resolved 异常是 17 小时前重建生成的,
--days=1 一条都命中不了,只能手写 SQL。

- --days=0 表示不过滤时间,归档全部已处理行(open 仍不归档);
- 执行时打印一次性清理提示,避免日常误用;
- 记录 2026-10-25 的实际清理结果:151,939 行 / 152 批 / 3.9 秒,
  热表 260,253 → 108,314(全为 open),VACUUM FULL 后 155 MB → 51 MB,
  归档表 61 MB,主键重叠 0 条。

验证:--days=0 --dry-run 返回 retentionDays=0、archivableRows=0(已清空)。
This commit is contained in:
yml2213
2026-10-25 13:34:09 +08:00
parent ccc71e0aab
commit 39fe448b48
2 changed files with 11 additions and 1 deletions
+5
View File
@@ -482,9 +482,14 @@ npm run revenue:backfill -- --batch-size=2000 --max-batches=100
| 落点 | `cost_exceptions_archive`(保留原 id 与时间字段,加 `archived_at`) |
| 执行 | `data-retention` 每日任务;每批 1000 行,`DELETE ... RETURNING` + `INSERT` 同语句,单批原子 |
| 手动 | `npm run cost-exceptions:archive -- --dry-run` / `-- --days=90` |
| 一次性清理 | `npm run cost-exceptions:archive -- --days=0`(不按时间过滤,归档全部已处理行;open 仍不归档) |
归档不删除审计痕迹,但热表查询与页面上不会再出现这些历史行;需要追溯时查归档表。
> **2026-10-25 已执行一次性清理**:`--days=0` 口径归档 151,939 条 resolved 异常(152 批,3.9 秒)。
> 热表 260,253 → 108,314 行(全部为 open),`VACUUM FULL` 后体积 155 MB → 51 MB(heap 38 / idx 13),
> 归档表 61 MB;主键重叠校验 0 条。生产环境不要在业务时段跑 `VACUUM FULL`,日常由 autovacuum 复用空间即可。
---
## 十、关联文档