在程序中执行一个插入MySQL表操作的时候,提示了这个错误,

Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: 
Packet for query is too large (25,299,161 > 4,194,304). 
You can change this value on the server by setting the 'max_allowed_packet' variable.;

意思是当前的网络包大小是25299161,超过了4194304,按照提示,这个应该是max_allowed_packet参数控制的,如下所示,

mysql> show variables like 'max_allowed_packet%';
+--------------------------+------------+
| Variable_name            | Value      |
+--------------------------+------------+
| max_allowed_packet       | 4194304    |
+--------------------------+------------+
2 rows in set (0.01 sec)

4194304换算一下就是4M,25299161就是24M,因此设置个30M容量,如果要重启生效,需要改下my.cnf,增加这个参数,

max_allowed_packet = 30M

如果要即时生效,可以执行这个,但是要具备权限,

mysql> set global max_allowed_packet=30*1024*1024;
ERROR 1227 (42000): Access denied; 
you need (at least one of) the SUPER privilege(s) for this operation

切换用户,重新执行下,

mysql> set global max_allowed_packet=31457280;
Query OK, 0 rows affected (0.00 sec)

但是很奇怪,从显示上看,好像未生效?

mysql> show variables like 'max_allow%';
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
|max_allowed_packet | 4194304 |
+--------------------+---------+
1 row in set (0.01 sec)

搜了一些资料,有的说是客户端的问题,其实已经改了,重新登录即可,尝试一下,确实生效了,

mysql> show variables like 'max_allow%';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
|max_allowed_packet  | 31457280 |
+--------------------+----------+
1 row in set (0.00 sec)

再次执行程序,此时的插入,就正常了,但是既然MySQL设置了max_allowed_packet,就会有他的作用,例如在带宽有限的场景,可能就需要他来控制网络传输量了,不能让网络传输,成为瓶颈。