同步任务日志只有一行 ERROR batch insert failed。5 万行里坏了两万行,运维不知道是哪两万,只能整批重跑。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,批量写入把异常统一 catch 成一条日志,没有记录主键和原始值。逐行重试又太慢,索性整批放弃。失败数据没有落地,问题只能靠猜。重跑一次失败,判断依据还是那行日志。
「同步失败明细缺失」这类改动最怕改一半,回滚脚本先准备好,再动生产。改完顺手把文档补一句,省得下次自己重新推一遍。
INSERT INTO sync_dead_letter (batch_id, pk_id, err_code, raw_json, created_at) VALUES (?, ?, ?, ?, NOW());
监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
具体做法是,捕获异常后逐行重试 把失败行和错误码写到死信表;日志里带上批次号和主键范围;死信表按天分区 方便按批查;修完数据从死信表回放 不用整批重来。
最后用这个标准收尾,下一次失败时死信表能查到具体哪几行 回放后全部入库。
