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:
@@ -7,6 +7,7 @@
|
||||
* npm run cost-exceptions:archive -- --dry-run
|
||||
* npm run cost-exceptions:archive -- --days=90
|
||||
* npm run cost-exceptions:archive -- --days=60 --batch-size=2000
|
||||
* npm run cost-exceptions:archive -- --days=0 # 一次性清理:归档全部已处理行
|
||||
*/
|
||||
import process from 'node:process'
|
||||
|
||||
@@ -19,13 +20,17 @@ import {
|
||||
|
||||
const options = parseOptions(process.argv.slice(2))
|
||||
const defaultDays = Number(runtimeConfig.retention?.costExceptionDays) || 60
|
||||
const retentionDays = normalizeInteger(options.days, defaultDays, 1, 3650)
|
||||
// 0 表示不按时间过滤:一次性把已处理的历史异常全部归档(日常任务永远 >= 1 天)。
|
||||
const retentionDays = normalizeInteger(options.days, defaultDays, 0, 3650)
|
||||
const batchSize = normalizeInteger(options.batchSize, 1000, 1, 10_000)
|
||||
const dryRun = options.dryRun === 'true'
|
||||
|
||||
async function main() {
|
||||
const startedAt = Date.now()
|
||||
const archivable = await countArchivableCostExceptions(retentionDays)
|
||||
if (retentionDays === 0) {
|
||||
console.warn('[archive] days=0:一次性清理,将归档全部已处理异常(open 行不受影响)')
|
||||
}
|
||||
|
||||
if (dryRun) {
|
||||
console.log(
|
||||
|
||||
Reference in New Issue
Block a user