【线上问题】
昨天订单对接方反应,从我们平台系统下的单,没有传到他们的erp系统中。运营找我处理,因为手头上刚开始开发下周要上线的需求,就用之前写好的补偿机制接口同步过去,以为只是一个订单出问题了,也没查问题。后来,给我发了一堆订单号,说是都没有同步,只能去服务器上查问题了。错误如下:
2018-10-23 13:03:36 [ qtp1867717141-13:4121860953 ] - [ ERROR ] org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions(SqlExceptionHelper.java:146) Packet for query is too large (3038 > 10
24). You can change this value on the server by setting the max_allowed_packet' variable.
【问题原因】
MySQL根据配置文件会限制Server接受的数据包大小。有时候插入、更新或查询时数据包的大小,会受 max_allowed_packet 参数限制,导致操作失败。
查看 max_allowed_packet 参数:
在客户端执行:show VARIABLES like ‘%max_allowed_packet%’;
得到的结果如下:
Variable_name | Value |
---|---|
max_allowed_packet | 1024 |
最大只允许1024,也就是1M,所以导致消息在消费的过程中出现错误,订单传递也失败了。
【解决方法】
修改默认最大允许包大小。
方式一:命令方式
(1).在mysql控制台下输入以下命令,设置max_allowed_packet为20M
set global max_allowed_packet = 20*1024*1024;
(2).退出mysql,重启mysql服务,再登录myql中查询max_allowed_packet是否修改成功
show VARIABLES like '%max_allowed_packet%';
方式二:修改配置文件my.cnf方式
(1).mysql控制台下输入以下命令,编辑my.cnf
sudo vi /etc/mysql/my.cnf
(2).在[mysqId]下面添加
max_allowed_packet = 20M
退出编辑模式,重启mysql.
【问题总结】
在处理问题过程中,问运维为什么出现这个问题了,之前并没有出现过。
她给我的答案是可能被别人修改了,但我觉得并不是别人改了参数问题,问题最早是出现在上周日,周一处理了,但周三又有同样的问题。
所以在写这篇博客的过程中,我查了些关于此问题的一些文章,还是觉得应该是服务器内存容量不够的原因。所以mysql可能会自动重设参数。所以某些情况下可能是你当时更改完max_allowed_packet参数,过一段时间mysql自动重设参数变为默认的1024,又出现了同样的错误。