批量同步每 5000 行提交一次,报 1153 Got a packet bigger than 'max_allowed_packet' bytes。单行最大 40KB,一批算下来接近 200MB。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

SHOW VARIABLES LIKE 'max_allowed_packet';
SET GLOBAL max_allowed_packet = 67108864;

max_allowed_packet 默认只有 64MB 甚至更小,一批数据拼成一条多值 insert 后超过上限,服务端直接断开连接。行里带长文本时,按行数分批估不准字节数。断连之后客户端还会当成网络问题重试,实际每次都被拒。这一点先确认清楚,后面就不用反复试。

「批量写入包超限」这类改动最怕改一半,回滚脚本先准备好,再动生产。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

具体做法是,先按字节数分批 每条 SQL 控制在 8MB 以内;max_allowed_packet 调到 64MB 两端都要改 只改一端没用;长文本字段拆到单独的宽表同步;批量写入加失败重试 拆半批再试一次。

改完照着核一遍,同样 5000 行的批次拆成 8 批后全部写入成功 不再出现 1153。

作者 9823189