通信数据包是发送到 MySQL 服务器的单个 SQL 语句、发送到客户端的单个行或从复制源服务器发送到副本的二进制日志事件。
可以传输到 MySQL 5.7 服务器或客户端或从中传输的最大可能数据包为 1GB。
当 MySQL 客户端或mysqld服务器接收到大于
max_allowed_packet
字节的数据包时,它会发出
ER_NET_PACKET_TOO_LARGE
错误并关闭连接。Lost connection to MySQL server during
query
对于某些客户端,如果通信数据包太大
,您也可能会收到错误消息。
客户端和服务端都有自己的
max_allowed_packet
变量,所以如果要处理大包,就必须在客户端和服务端都增加这个变量。
如果你使用的是mysql客户端程序,它的默认
max_allowed_packet
变量是16MB。要设置一个更大的值,像这样启动mysql
:
$> mysql --max_allowed_packet=32M
这将数据包大小设置为 32MB。
服务器的默认
max_allowed_packet
值为 4MB。如果服务器需要处理大查询(例如,如果您正在处理大
BLOB
列),您可以增加它。例如,要将变量设置为 16MB,像这样启动服务器:
$> mysqld --max_allowed_packet=16M
您还可以使用选项文件来设置
max_allowed_packet
. 例如,要将服务器的大小设置为 16MB,请在选项文件中添加以下行:
[mysqld]
max_allowed_packet=16M
增加这个变量的值是安全的,因为额外的内存只在需要时分配。例如, mysqld仅在发出长查询或mysqld必须返回大结果行时分配更多内存。该变量的较小默认值是一种预防措施,可以捕获客户端和服务器之间的错误数据包,并确保您不会因意外使用大数据包而耗尽内存。
BLOB
如果您使用大值但没有为mysqld提供足够的内存来处理查询,
您也会遇到大数据包的奇怪问题。如果您怀疑是这种情况,请尝试将ulimit -d 256000添加到mysqld_safe脚本的开头并重新启动mysqld。