MySQL Packet for query is too large问题及解决方法

MySQL Packet for query is too large问题及解决方法

Posted by fengdi on June 4, 2019

项目运行过程中出现数据库max_allowed_packet参数错误,现将整个解决过程记录下来

1、问题描述与分析

  • Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1354 > 1024). You can change this value on the server
    by setting the max_allowed_packet’ variable
  • MySQL根据配置文件会限制Server接受的数据包大小(默认1024,即1M)。有时候插入、更新或查询时数据包的大小,会受 max_allowed_packet 参数限制,导致操作失败。针对该问题,需要在服务器上设置mysql的相应参数为合适的值就能解决问题。(该参数为max_allowed_packet)

2、问题解决方法

2.1、首先登录到mysql数据库上,查看目前max_allowed_packet配置大小

show VARIABLES like '%max_allowed_packet%';

默认得到结果如下(说明目前的配置是:1M):

Variable_name Value
max_allowed_packet 1024

2.2、修改max_allowed_packet配置大小(提供以下2种方法)

2.2.1、在mysql配置文件中修改

可以编辑my.cnf来修改(windows下my.ini),在[mysqld]段或者mysql的server配置段进行修改

max_allowed_packet = 20M

如果找不到my.cnf可以通如下命令寻找my.cnf文件位置,linux下该文件在/etc/下

mysql --help | grep my.cnf
2.2.2、在mysql命令行中修改

在mysql命令行中运行

set global max_allowed_packet = 2*1024*1024*10

2.3、重启mysql服务

  • 使用 service 启动:service mysqld restart

  • 使用 mysqld 脚本启动:/etc/inint.d/mysqld restart

2.4、查看改后配置

在mysql命令行中运行

show VARIABLES like '%max_allowed_packet%';

注意:该值设置过小将导致单个记录超过限制后写入数据库失败,且后续记录写入也将失败

3、设置了max_allowed_packet参数后,又自动恢复到原来的值

导致这个原因可能有两种情况:

  • 服务器内存不够
  • 黑客攻击