MySQL Packet for query is too large

本文介绍了解决MySQL中因数据包过大导致的PacketTooBigException异常的方法,包括调整max_allowed_packet参数、重启服务及验证配置更改的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (3227 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3178)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1917)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1383)
at sun.reflect.GeneratedMethodAccessor34.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.logicalcobwebs.proxool.ProxyStatement.invoke(ProxyStatement.java:100)
at org.logicalcobwebs.proxool.ProxyStatement.intercept(ProxyStatement.java:57)
at $java.sql.Statement
EnhancerByProxool
5159dcd0.executeQuery(<generated>)
at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:441)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:396)
... 52 more

原因: 查询出的数据包过大,默认情况下mysql 的字段容量不够装,所以抛出此异常

解决办法:

1.首先在控制台查询一下:SHOW VARIABLES LIKE '%max_allowed_packet%';

mysql> SHOW VARIABLES LIKE '%max_allowed_packet%';
+--------------------------+------------+
| Variable_name            | Value      |
+--------------------------+------------+
| max_allowed_packet       | 1024       |
| slave_max_allowed_packet | 1073741824 |
+--------------------------+------------+


默认情况下,最大允许数据包的容量是1M ,需要修改更大一点。20M

2.到mysql 的安装目录下找到 my.cnf 文件中,新增
[root@ecs-5d24-0001 ~]# vim /etc/my.cnf
[mysqld] 
character-set-server=utf8
max_allowed_packet=20M
 

备注:默认情况下是没有上述的标记,有就修改,没有就添加

3. 重启mysql服务

4.在控制台查看是否修改成功,在命令控制台输入:SHOW VARIABLES LIKE '%max_allowed_packet%';

显示:

mysql> SHOW VARIABLES LIKE '%max_allowed_packet%';
+--------------------------+------------+
| Variable_name            | Value      |
+--------------------------+------------+
| max_allowed_packet       | 20971520   |
| slave_max_allowed_packet | 1073741824 |
+--------------------------+------------+
2 rows in set

5.修改成功,有效!

后续:

遇到mysql 服务停掉后,有时候设置的max_allowed_packed 的没有用,需要使用

set global max_allowed_packet = 2*1024*1024*10; 
设置成功了,以后重启也没事。
 

### 解决方案概述 当遇到 `packet for query is too large` 错误时,通常意味着 MySQL 或 MariaDB 接收到的数据包超出了允许的最大尺寸。此错误可以通过调整配置参数 `max_allowed_packet` 来解决。 #### 配置查询与修改 可以使用以下命令来查询当前的 `max_allowed_packet` 值: ```sql SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet'; ``` 默认情况下,该值可能设置得较低(例如 1MB)。为了处理更大的数据包,需要增加这个值[^3]。 #### 修改方法 通过编辑 MySQL/MariaDB 的配置文件 `my.cnf` 或者动态更改服务器变量来进行调整。以下是两种常见的修改方式: 1. **静态修改(推荐用于永久生效)** 编辑 `my.cnf` 文件,在 `[mysqld]` 节下添加或更新如下行: ```ini [mysqld] max_allowed_packet=64M ``` 完成后重启数据库服务以使更改生效。 2. **动态修改(临时有效直至下次重启)** 使用 SQL 命令直接修改运行中的实例配置: ```sql SET GLOBAL max_allowed_packet=67108864; ``` 这里将最大允许的数据包大小设为 64MB。注意单位转换:每 MB 对应 \(1024 \times 1024\) 字节[^2]。 #### 数据验证与优化建议 除了增大 `max_allowed_packet` 参数外,还应该考虑是否有更优的方法减少单次传输的数据量。比如采用分页查询代替一次性加载大量记录;或者利用 `SELECT INTO OUTFILE` 导出大表内容至外部文件再做进一步操作[^4]。 --- ### 注意事项 尽管提高 `max_allowed_packet` 可快速解决问题,但也需警惕其潜在风险——过高的设定会占用更多内存资源并可能导致性能下降。因此合理评估实际需求后再决定最终数值是非常重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值