MySQL Packet for query is too large (xxx > xxx)...by setting the ‘max_allowed_packet‘ variable.的解决办法

39 篇文章 5 订阅
31 篇文章 0 订阅

问题概述

关于这个问题,博主是在项目上线生产运行的过程中遇到的,在一次运营部门的同事通知,系统功能操作出现异常,博主随即对问题展开排查和处理,通过后台日志发现,事务提交失败 “ Could not commit JDBC transaction; ”,导致事务提交失败的原因是因为系统中查询的数据包太大 “ Packet for query is too large (4,529,504 > 4,194,304). ”,如下图:

如下图:

具体异常信息如下:

Caused by: com...commons.result.AppException: Could not commit JDBC transaction; nested exception is java.sql.SQLException: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (4,529,504 > 4,194,304). You can change this value on the server by setting the 'max_allowed_packet' variable.
	at com....common.aspect.LogAspect.around(LogAspect.java:58) ~[classes!/:0.0.1-SNAPSHOT]
	at sun.reflect.GeneratedMethodAccessor767.invoke(Unknown Source) ~[na:na]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_282]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_282]
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) ~[spring-aop-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) ~[spring-aop-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) ~[spring-aop-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) ~[spring-aop-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) ~[spring-aop-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) ~[spring-aop-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
	... 47 common frames omitted

解决办法

分析问题:

从后台打印的异常信息中得知,导致系统功能操作异常,事务提交失败,是因为查询的数据包过大导致的,
根据错误信息,查询当前数据库中的 “ max_allowed_packet ” 大小(注:该参数的单位->B,即字节),
输入指令“ SHOW VARIABLES LIKE '%max_allowed_packet%'; ”,如下图:

 结合控制台的异常信息 (4,529,504 > 4,194,304),默认数据包大小为4,194,304字节,

很显然,最终的问题出现在了MySQL 的数据包限制上面,到这儿问题找到了,

解决问题:

MySQL 中默认定义了Server接收的数据包大小。在进行系统更新、查询、新增数据包时,其数据包的大小会受 max_allowed_packet 参数限制,导致操作失败。

解决办法有三种:
第一种,修改代码程序,如果必须,将数据包进行拆分(业务逻辑拆分),通过优化数据包的大小来解决这个问题,例如,之前是所有数据一次提交,优化后每次提交100条数据,只不过数据量大的时候,一个这样的业务功能操作点消耗时间有点长了

第二种,通过指令来修改 “ max_allowed_packet ” 的大小,
输入指令 “ SET GLOBAL max_allowed_packet = 20971520; ”,
设置成功后,再次查看,如下图:

注:20971520的由来,因为该参数的单位为B,需要进行换算,目前设置为20M,

则 20 *1024 *1024 = 20971520字节

第三种,通过修改MySQL的配置文件(在安装目录下)“ my.cnf ”中的 “ max_allowed_packet ”,有就修改,没有就添加一个(windows->my.ini,Linux->my.cnf),
max_allowed_packet = 20971520

如果是容器,直接挂载一个 “ my.cnf ” 的配置文件进去即可,内容如下(注意标头):

[mysqld]
max_allowed_packet = 20971520

如下图:

修改好后,因为是配置文件,需要重新启动MySQL服务才能加载,这个是第三种解决办法的弊端,如果当前需要马上解决这个问题,但是又不能中断系统服务,则只能使用第二种,先把问题解决了再考虑后面的事。

修改好 “ max_allowed_packet ” 数据包限制后,再次提交操作,就可以该问题了,如下图:

小结:
第二种解决办法如果MySQL服务重启,则 max_allowed_packet 默认值将还原到之前的大小,第三种方法则会永久保持,关于这两种方法的应用,
如果是临时解决这个问题,让用户先用起来,则使用第二种方法,如果没有时限性,可以考虑修改MySQL的配置文件,然后中断系统服务,重启MySQL服务器,以满足其配置文件生效目的。


好了,关于 MySQL Packet for query is too large (xxx > xxx)...by setting the 'max_allowed_packet' variable.的解决办法 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。 
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。


作       者:华    仔
联系作者:who.seek.me@java98k.vip
来        源:CSDN (Chinese Software Developer Network)
原        文:https://blog.csdn.net/Hello_World_QWP/article/details/122962952
版权声明:本文为博主原创文章,请在转载时务必注明博文出处!
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值