保留是产品和法律决策
删除数据容易,删除正确的数据并证明它很难。先做数据盘点:存了什么、谁负责、为什么保留、保留多久。法律保留和合同义务优先于默认计划。工程不应在迁移脚本里自行发明保留期限。
-- 试运行:按月统计候选记录
SELECT date_trunc('month', created_at) AS month, count(*)
FROM events
WHERE created_at < now() - interval '90 days'
AND legal_hold = false
GROUP BY 1
ORDER BY 1;
小批量删除
一次性 DELETE FROM events WHERE created_at < ... 可能锁住大表、造成膨胀并产生巨大事务。按主键范围分批删除,每批提交。任务要可重启且幂等:失败后重跑不能重复删除或跳过记录。
DELETE FROM events
WHERE id IN (
SELECT id FROM events
WHERE created_at < now() - interval '90 days' AND legal_hold = false
ORDER BY id
LIMIT 1000
);
证明它
在审计日志中记录规则、候选数、删除数和操作者。验证保留数据仍在、必需记录完整。监控任务滞后和失败。静默停止的保留任务是合规问题;删除法律保留数据则是事故。