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