通信包是指发送到 MySQL 服务器的单个 SQL 语句、发送到客户端的单行数据或从复制源服务器发送到副本的二进制日志事件。
MySQL 8.3 服务器或客户端可以传输的最大数据包大小为 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
值为 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。