MySQL ERROR 1118 Row size too large 或 PacketTooBigException: Packet for query is too large

本文详细介绍了如何解决MySQL中常见的错误1118(Row size too large)和PacketTooBigException(Packet for query is too large)。通过调整my.ini配置文件中的参数,如innodb_log_file_size、innodb_log_buffer_size、innodb_strict_mode和max_allowed_packet,可以有效避免这些错误。文章提供了具体的修改步骤和重启服务的方法。

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

错误1:

ERROR 1118
Row size too large (> 8126). Changing some columns to TEXT or
BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
原因:字段太多,超过mysql默认配置的字段数量了,可以通过修改配置来扩大数量。

或者是错误2:

com.mysql.jdbc.PacketTooBigException: Packet for query is too large
原因:每次传输的包太大了,超过了配置文件里配置的最大包大小了。

解决步骤

步骤1:知道要修改哪些配置参数:

对于原因1,我自己是添加了3个配置参数:
innodb_log_file_size = 500M
innodb_log_buffer_size = 800M
innodb_strict_mode = 0
对于原因2,只需添加1个参数:
max_allowed_packet = 256M
前面3个参数是我参考这个得出来的:https://stackoverflow.com/questions/22637733/mysql-error-code-1118-row-size-too-large-8126-changing-some-columns-to-te

步骤2:编辑my.ini配置文件,将上面的参数输进去

linux下是:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
编辑完my.ini之后,按Ctrl + X退出,按提示输入Y然后回车保存

windows下的my.ini所在位置:
https://blog.youkuaiyun.com/Sunshine_ZCC/article/details/75195953
(注: 如果已经配置了AAA=123,又想配置AAA=456,记得注释掉其中一个,否则mysql会以最后出现的为准。)

步骤3:重启mysql服务

linux下:
/etc/init.d/mysqld restart 或者 service mysqld restart 或者 service mysql restart,然后输入密码。如图:
在这里插入图片描述
windows下:好像好像是在任务管理器里的服务那里,重启mysql服务,好像要重启多个mysql的服务

<think>首先,用户的问题是关于解决MySQL异常:com.mysql.jdbc.PacketTooBigException: Packet for query is too large (40 > -1)。用户提供了多个引用,这些引用讨论了类似的问题和解决方案。 关键点: - 异常信息:Packet for query is too large (40 > -1) - 在引用中,异常通常是由于MySQL的max_allowed_packet参数设置得太小,导致查询包过大。 - 解决方案包括调整max_allowed_packet参数的值,者分批处理数据。 用户的问题中,异常显示40 > -1,这很奇怪,因为-1通常表示没有限制。但在MySQL中,max_allowed_packet不能是负数。引用[5]提到类似问题,其中服务器配置的max_allow_packet太小。 分析用户的问题: - 错误信息:Packet for query is too large (40 > -1) - 40字节大于-1?这似乎不合理,因为-1可能表示无限错误值。 - 在MySQL中,max_allowed_packet是一个无符号整数,不能为负。所以-1可能是一个错误特殊情况。 回顾引用: - 引用[1]:解决PacketTooBigException,建议调整max_allowed_packet。 - 引用[2]:类似,导入大数据时异常,建议修改参数分批插入。 - 引用[3]:原因和解决方案,分批插入数据。 - 引用[4]:设置global max_allowed_packet。 - 引用[5]:新装MySQL配置小,需要修改并重启数据库。 针对用户的具体错误(40 > -1),这可能是一个误报特殊情况。但根本原因相同:max_allowed_packet设置不当。 解决方案步骤: 1. 确认max_allowed_packet的当前值。 2. 调整max_allowed_packet的值。 3. 考虑分批处理数据以避免大包。 4. 确保修改后重启MySQL服务。 在回答中,我需要: - 使用中文。 - 结构清晰,逐步解决问题。 - 引用相关段落时添加引用标识。 - 生成相关问题。 - 在数学表达式中使用$...$$$...$$格式(虽然这里可能不需要,但如果有数字计算,要用)。 回答结构: 1. 解释异常原因。 2. 提供解决方案步骤。 3. 给出代码示例命令。 4. 生成相关问题。 最终输出: - 回答部分。 - §§相关问题§§部分。 生成相关问题: - 基于主题,如如何预防此异常、其他优化方法等。</think>### 解决MySQL PacketTooBigException异常问题 您遇到的异常`com.mysql.jdbc.PacketTooBigException: Packet for query is too large (40 > -1)`是由于MySQL的`max_allowed_packet`参数设置不当导致的。该参数定义了MySQL服务器和客户端之间一次传输数据包的最大大小(单位:字节)。如果查询插入的数据包大小超过此限制,就会触发此异常。在您的错误信息中,`40 > -1`表示实际数据包大小为40字节,但服务器配置的`max_allowed_packet`值异常(-1通常表示未设置无效值)。这可能是MySQL配置错误服务未正确加载参数所致。以下是系统化的解决方案,基于参考引用中的最佳实践[^1][^2][^3][^4][^5]。 #### 解决方案步骤 1. **确认当前参数值** 登录MySQL数据库,检查`max_allowed_packet`的当前设置。执行以下SQL命令: ```sql SHOW VARIABLES LIKE 'max_allowed_packet'; ``` 如果输出显示`-1`一个很小的值(如2048字节),则说明参数需要调整[^5]。 2. **调整`max_allowed_packet`参数** - **临时修改(服务重启后失效)**: 在MySQL命令行中运行: ```sql SET GLOBAL max_allowed_packet = 64*1024*1024; -- 设置为64MB,根据需求调整 ``` 例如,如果数据包较大,建议设置为`64*1024*1024`(64MB)更高[^4][^5]。 - **永久修改(需修改配置文件)**: 1. 找到MySQL配置文件(通常为`my.cnf``my.ini`)。 2. 在`[mysqld]`部分添加修改行: ```ini max_allowed_packet = 64M ``` 3. 保存文件并重启MySQL服务: ```bash service mysql restart # Linux系统 # net stop mysql && net start mysql # Windows系统 ``` 永久修改确保参数在重启后生效[^5]。 3. **分批处理数据(适用于大数据操作)** 如果异常发生在批量插入查询操作中(如导入Excel数据),优先采用分批处理来避免大包: - 在代码中将数据分割成小批次。例如,使用Java的`Lists.partition`: ```java import com.google.common.collect.Lists; List<Data> dataList = ... // 原始数据列表 Lists.partition(dataList, 500).forEach(batch -> { // 每批500条 mapper.batchInsert(batch); // 执行插入 }); ``` 这能有效减少单次数据包大小,无需修改服务器参数[^3]。 4. **验证和测试** - 修改后,重新运行查询导入操作。 - 如果问题依旧,检查MySQL错误日志(通常位于`/var/log/mysql/error.log`)确认参数是否生效[^5]。 #### 注意事项 - **重启服务关键性**:永久修改配置文件后必须重启MySQL,否则新值不会加载(常见错误原因)[^5]。 - **参数值计算**:设置`max_allowed_packet`时,需根据数据包大小估算。例如,如果最大数据包预计为10MB,则设置值应大于$10 \times 1024 \times 1024 = 10,485,760$字节[^4]。 - **安全考虑**:过大的`max_allowed_packet`可能增加内存压力,建议在测试环境先优化[^1]。 通过以上步骤,异常应能解决。如果问题复杂,提供更多上下文(如操作系统、MySQL版本)可进一步诊断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值