历史数据回刷跑了第二遍,用户累计消费金额从 1200 万变成 1320 万。脚本直接 update 累加,没有任何去重。日志里能对上时间点,这种反而好排。
回刷脚本的设计前提是只跑一次,写的是 amount = amount 加 delta 的累加更新。重跑时同一笔历史流水被再加一遍,累计值就虚高。回刷任务也没有记录批次号,跑没跑过全靠人记。这一点先确认清楚,后面就不用反复试。
CREATE TABLE tmp_user_amount AS SELECT user_id, SUM(amount) amount FROM src_flow WHERE dt BETWEEN '2026-01-01' AND '2026-02-28' GROUP BY user_id;
围绕「历史回刷幂等」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。
处理上按这个顺序:回刷改成按批次号覆盖 同一批次重复执行结果一致;用临时表算好全量结果 再一次性覆盖目标表;脚本入口加批次锁 防止两个人同时跑;回刷前备份目标表 出问题能退回去。
结果对不对很好判断,同一批次回刷三次 累计金额都是 1200 万 没有变化。
