MySQL之PacketTooBigException解决
文章转载自: https://www.jianshu.com/p/9cc501b4fc7d
之前在做一个项目优化的时候,有个小朋友写了一个批量插入mysql表的功能,但却发生了如下异常:
com.mysql.jdbc.PacketTooBigException: Packet for query is too large (2787754 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
意思是要插入的数据有2787754B约等于2.7MB,而mysql表中最大允许包为1048576B,即1MB,所以导致插入失败
在网上查了一下,MySQL会根据配置文件限制server接受的数据包大小,有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败。
要注意的是,“大”的插入和更新指的是整体接受的数据而言,所以除了插入或者更新的记录多可能导致数据包大小超过限制以外,单条插入或更新的记录很大也会导致数据包超过限制,导致失败,当然这种情况比较罕见。举个例子,在限制一公斤(1kg=1000g)重量的容器里,可以放1颗1公斤重的西瓜或者40颗25g的鸡蛋。对应的是在这个容器里放入一条记录,还是40条记录。
查看max_allowed_packet参数的设值是多少?
show VARIABLES like '%max_allowed_packet%';
结果如下:
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| max_allowed_packet | 1048576 |
| slave_max_allowed_packet | 1073741824 |
由此可知,max_allowed_packet限制了1MB的数据大小,超过这个阈值,MySQL便会抛出com.mysql.jdbc.PacketTooBigException异常
解决方法:
1. 修改MySQL的配置文件:
MySQL配置文件在Windows下叫my.ini,在MySQL的安装根目录下;
在Linux下叫my.cnf,该文件位于/etc/my.cnf
在Linux下如果找不到my.cnf文件,可以通过如下命令查询:
mysql --help | grep my.cnf
找到该配置文件后,打开文件
vim /etc/my.cnf
加入或修改max_allowed_packet的值:
max_allowed_packet = 16M
具体设置多大,视情况而定,然后重启mysql就可以了
mysql重启命令:
/etc/init.d/mysql restart
线上情况,重启MySQL慎用,实在没办法的情况下才考虑
2. 执行命令修改:
进入mysql server
在mysql 命令行中运行
set global max_allowed_packet = 16777216
然后关闭掉这此mysql server链接,再进入。
show VARIABLES like '%max_allowed_packet%';
查看下max_allowed_packet是否编辑成功
注意:
这种情况虽然不需要重启MySQL服务,但是如果某一天MySQL需要重启,该设置就会恢复到原来的设置1MB
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示