# B.3.2.8 数据包太大

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

可以传输到 MySQL 8.0 服务器或客户端或从 MySQL 8.0 服务器或客户端传输的最大可能数据包为 1GB。

当 MySQL 客户端或mysqld服务器收到一个大于max_allowed_pa​​cket字节,它发出一个ER_NET_PACKET_TOO_LARGE (opens new window)错误并关闭连接。对于一些客户,您可能还会获得查询期间丢失与 MySQL 服务器的连接通信包过大时出错。

客户端和服务器都有自己的max_allowed_pa​​cket变量,所以如果你想处理大数据包,你必须在客户端和服务器中都增加这个变量。

如果您正在使用mysql客户端程序,默认max_allowed_pa​​cket变量为 16MB。要设置更大的值,请开始mysql像这样:

$> mysql --max_allowed_packet=32M

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

服务器的默认值max_allowed_pa​​cket值为 64MB。如果服务器需要处理大查询(例如,如果您正在使用大斑点列)。例如,要将变量设置为 128MB,请像这样启动服务器:

$> mysqld --max_allowed_packet=128M

您还可以使用选项文件来设置max_allowed_pa​​cket.例如,要将服务器的大小设置为 128MB,请在选项文件中添加以下行:

[mysqld]
max_allowed_packet=128M

增加此变量的值是安全的,因为仅在需要时才分配额外的内存。例如,mysqld仅当您发出长查询或何时分配更多内存mysqld必须返回一个大的结果行。该变量的小默认值是为了防止在客户端和服务器之间捕获不正确的数据包,并确保您不会因意外使用大数据包而耗尽内存。

如果你使用大数据包,你也会遇到奇怪的问题斑点值但未给出mysqld访问足够的内存来处理查询。如果您怀疑是这种情况,请尝试添加ulimit -d 256000到开头mysqld_安全的脚本并重新启动mysqld.