导入包含长文本的历史数据时报错中断,单条记录只有几兆,本地库能写进去,线上库却一直失败。

原因不止一个,得分开看。服务端与客户端的数据包上限都偏小。还有一种是批量插入把多条记录拼成了一个大包。

还有一种情况,导入工具自身还有独立的限制。

第一件事是看两端的包大小上限

mysql -e "show variables like 'max_allowed_packet'"

调大服务端上限

mysql -e "set global max_allowed_packet=67108864"

然后导入时按行拆分

split -l 500 /data/dump.sql /data/part_

剩下的就是确认写入结果

mysql -e "select max(length(body)) from 库名.表名"

改之前我把相关日志按时间截了一段存着,事后对时间线用得上。

中途换过一次思路,把范围缩到最小的那一层,反而快了。

改完先别撤,确认这几项。大字段能正常写入,导入任务不再中断,错误日志没有包过大记录。

提醒一点。客户端参数也要跟着调,否则服务端改了照样报错;超过上限的备份文件用拆分方式更稳。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189