sql大量插入或删除 Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large

sql大量写入或更新 Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1593553 > 1048576).


原因

MySQL会根据配置文件会限制server接受的数据包的大小。如果写入大数据时,因为默认的配置太小,插入和更新操作会因为 max_allowed_packet 限制,而导致失败。max_allowed_packet 如果不设置,默认值在不同的 MySQL 版本表现不同,我遇到的这个问题,sql是默认1M;


查看

数据库中查看当前配置大小:

show VARIABLES like '%max_allowed_packet%';

查询结果:

+--------------------------+------------+

| Variable_name | Value |

+--------------------------+------------+

| max_allowed_packet | 1048576 |

| slave_max_allowed_packet | 1073741824 |

由此可知,max_allowed_packet限制了1MB的数据大小(sql里面显示的单位为b,字节),超过这个阈值,MySQL便会抛出com.mysql.jdbc.PacketTooBigException异常


解决:

修改方法1(配置文件持久化修改):
vim /etc/my.cnf
[mysqld]

max_allowed_packet = 100M

注意:修改配置文件以后,需要重启mysql服务才能生效。

mysql> show variables like ‘%max_allowed_pack%’;

±-------------------±----------+
| Variable_name | Value |
±-------------------±----------+
| max_allowed_packet | 104857600 |
±-------------------±----------+
1 row in set (0.00 sec)

修改方法2(命令行临时修改):

mysql> set global max_allowed_packet = 100 * 1024 * 1024;
mysql> exit
[root@localhost opt]#
[root@localhost opt]# mysql -uroot
mysql>
mysql> select @@max_allowed_packet;

±---------------------+
| @@max_allowed_packet |
±---------------------+
| 104857600 |
±---------------------+
1 row in set (0.00 sec)

mysql>

注意:

1.命令行修改时,不能用M、G,只能这算成字节数设置。配置文件修改才允许设置M、G单位。

2.命令行修改之后,需要退出当前回话(关闭当前mysql server链接),然后重新登录才能查看修改后的值。通过命令行修改只能临时生效,下次数据库重启后又复原了。如果是生产环境,可以两个都设置,这样线上直接生效,数据库不会受到影响,配置文件更改,后面就算sql重启也不会有问题;

3.max_allowed_packet 最大值是1G(1073741824),如果设置超过1G,查看最终生效结果也只有1G。



猜你喜欢

转载自blog.csdn.net/weixin_44958006/article/details/117780658
今日推荐