背景#
数据库备份执行SQL文件时,执行到图片表插入图片数据时错误:
错误提示: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
配置;