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