B.4.2.9 数据包太大

通信数据包是发送到 MySQL 服务器的单个 SQL 语句,发送到 Client 端的单个行或从源复制服务器发送到副本的二进制日志事件。

可以向 MySQL 5.7 服务器或 Client 端传输的最大数据包为 1GB。

当 MySQLClient 端或mysqld服务器收到大于max_allowed_packet字节的数据包时,它将发出ER_NET_PACKET_TOO_LARGE错误并关闭连接。对于某些 Client 端,如果通信包太大,您也可能会收到Lost connection to MySQL server during query错误。

Client 端和服务器都有自己的max_allowed_packet变量,因此,如果要处理大数据包,则必须在 Client 端和服务器中都增加此变量。

如果使用的是mysqlClient 端程序,则其默认max_allowed_packet变量为 16MB。要设置更大的值,请像这样启动mysql

shell> mysql --max_allowed_packet=32M

这会将数据包大小设置为 32MB。

服务器的默认max_allowed_packet值为 4MB。如果服务器需要处理大查询(例如,如果要处理大BLOB列),则可以增加此值。例如,要将变量设置为 16MB,请按以下方式启动服务器:

shell> mysqld --max_allowed_packet=16M

您还可以使用选项文件设置max_allowed_packet。例如,要将服务器的大小设置为 16MB,请在选项文件中添加以下几行:

[mysqld]
max_allowed_packet=16M

可以安全地增加此变量的值,因为仅在需要时才分配额外的内存。例如,mysqld仅在发出长查询或mysqld必须返回较大的结果行时才分配更多内存。变量的较小默认值是一种预防措施,可用于捕获 Client 端和服务器之间的错误数据包,并确保不会因意外使用大数据包而导致内存不足。

如果您使用的是大BLOB值,但没有授予mysqld访问足够的内存来处理查询,那么对于大数据包也可能会遇到奇怪的问题。如果您怀疑是这种情况,请尝试在mysqld_safe脚本的开头添加 ulimit -d 256000 并重新启动mysqld