mysql Got a packet bigger than ‘max_allowed_packet’ bytes

作者: zengde 分类: 数据库 发布时间: 2024-05-15 01:47

背景#

数据库备份执行SQL文件时,执行到图片表插入图片数据时错误:

190820-mysql-exe-sql-bigger-bytes.png

错误提示:Got a packet bigger than ‘max_allowed_packet’ bytes

原因分析及解决#

max_allowed_packet是什么意思?

max_allowed_packet针对的是一个事务中的一行记录大小,当一行记录超过了限制的大小,将会报错。

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

查询执行插入的表(filearchive)的大小:

mysql> select 
table_schema as '数据库',
table_name as '表名',
table_rows as '记录数',
truncate(data_length/1024/1024, 2) as '数据容量(MB)',
truncate(index_length/1024/1024, 2) as '索引容量(MB)'
from information_schema.tables
where table_schema='zxbdb'
order by data_length desc, index_length desc;
 -------- ----------------------------------- -------- -------------- -------------- 
| 数据库 | 表名                              | 记录数 | 数据容量(MB) | 索引容量(MB) |
 -------- ----------------------------------- -------- -------------- -------------- 
| zxbdb  | filearchive                       |    136 | 14.50        | 0.00         |

可以看到结果是14.5MB,那mysql默认max_allowed_packet的值是多少?

mysql> show VARIABLES like '%max_allowed_packet%';
 --------------------------- ------------ 
| Variable_name             | Value      |
 --------------------------- ------------ 
| max_allowed_packet        | 4194304    |
| mysqlx_max_allowed_packet | 67108864   |
| slave_max_allowed_packet  | 1073741824 |
 --------------------------- ------------ 
3 rows in set, 1 warning (0.00 sec)

可以看到是4MB,明显是超出了。

怎么修改?有两种方式:

  • 临时修改(mysql 重启后自动恢复默认值):输入命令 set global max_allowed_packet = 30*1024*1024;
  • 永久修改:修改my.ini文件的max_allowed_packet配置;

参考#

作者:ricolee

出处:https://www.cnblogs.com/ricolee/p/max_allowed_packet.html

版权:本作品采用「C」许可协议进行许可。