packet-too-large.md 2.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#### B.3.2.8 数据包太大

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

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

当 MySQL 客户端或[**mysqld**](mysqld.html)服务器收到一个大于[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)字节,它发出一个[`ER_NET_PACKET_TOO_LARGE`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_net_packet_too_large)错误并关闭连接。对于一些客户,您可能还会获得`查询期间丢失与 MySQL 服务器的连接`通信包过大时出错。

客户端和服务器都有自己的[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)变量,所以如果你想处理大数据包,你必须在客户端和服务器中都增加这个变量。

如果您正在使用[**mysql**](mysql.html)客户端程序,默认[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)变量为 16MB。要设置更大的值,请开始[**mysql**](mysql.html)像这样:

```
$> mysql --max_allowed_packet=32M
```

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

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

```
$> mysqld --max_allowed_packet=128M
```

您还可以使用选项文件来设置[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet).例如,要将服务器的大小设置为 128MB,请在选项文件中添加以下行:

```
[mysqld]
max_allowed_packet=128M
```

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

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