MySQL之PacketTooBigException解决

MySQL之PacketTooBigException解决,第1张

之前在做一个项目优化的时候,有个小朋友写了一个批量插入mysql表的功能,但却发生了如下异常:

意思是要插入的数据有2787754B约等于2.7MB,而mysql表中最大允许包为1048576B,即1MB,所以导致插入失败

在网上查了一下,MySQL会根据配置文件限制server接受的数据包大小,有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败。

要注意的是,“大”的插入和更新指的是整体接受的数据而言,所以除了插入或者更新的记录多可能导致数据包大小超过限制以外,单条插入或更新的记录很大也会导致数据包超过限制,导致失败,当然这种情况比较罕见。举个例子,在限制一公斤(1kg=1000g)重量的容器里,可以放1颗1公斤重的西瓜或者40颗25g的鸡蛋。对应的是在这个容器里放入一条记录,还是40条记录。

查看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文件,可以通过如下命令查询:

找到该配置文件后,打开文件

加入或修改max_allowed_packet的值:

max_allowed_packet = 16M

具体设置多大,视情况而定,然后重启mysql就可以了

mysql重启命令:

线上情况,重启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

导入sql文件的时候 死活导不进 总归失败

max_allowed_packet就是来限制单个表的大小,而不是sql文件大小。

max_allowed_packet 针对的是一个事务中的一行记录大小,当一行记录超过了限制的大小,将会报错。sql文件中每次insert完进同一张表的所有数据被称为一个数据包(packet),max_allowed_packet就是来限制这个的大小的阈值,大于这个值,mysql的I/O连接会关闭,就会报这个错。

进入mysql 设置

set global max_allowed_packet = 1024 1024 160

导入sql文件 成功!

原来到sql 都是正常的,可能突然数据量增加,超过了单个表单的大小限制,也算学习了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8717576.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存