通信数据包是指发送到 MySQL 服务器的单个 SQL 语句、发送到客户端的单个行或从复制源服务器发送到副本的二进制日志事件。
可以传输到或从 MySQL 9.0 服务器或客户端传输的最大数据包大小为 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 提供足够的内存来处理查询,您还会遇到与大型数据包相关的奇怪问题。如果您怀疑情况如此,请尝试在 mysqld_safe 脚本的开头添加 ulimit -d 256000 并重新启动 mysqld.