mysql解决ERROR 2006 (HY000): MySQL server has gone away

it2026-09-22  12

错误: 我们向mysql中上传sql文件时,由于数据包太大,导致报错。 登录mysql查看数据包的值

show global variables like 'max_allowed_packet';

我们通过提高packet上限的方法:

即时生效方法 使用如下命令: mysql> set global max_allowed_packet=1024*1024*16;

可在不重启MySQL的情况下立即生效,但是重启后就会恢复原样。

永久生效方法 编辑/etc/my.cnf,将 max_allowed_packet = 4M #修改为 max_allowed_packet = 16M

修改完成后需要重新启动mysql服务。

systemctl restart mysqld.service

之后重新导入,就不会产生ERROR 2006 (HY000): MySQL server has gone away错误了。

知识点补充:

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

可以向 MySQL 5.7 服务器或 Client 端传输的最大数据包为 1GB。

当 MySQLClient 端或mysqld服务器收到大于max_allowed_packet字节的数据包时,它将发出ER_NET_PACKET_TOO_LARGE错误并关闭连接。对于某些 Client 端,如果通信包太大,您也可能会收到Lost connection to MySQL server during query错误。

Client 端和服务器都有自己的max_allowed_packet变量,因此,如果要处理大数据包,则必须在 Client 端和服务器中都增加此变量。

如果使用的是mysqlClient 端程序,则其默认max_allowed_packet变量为 16MB。要设置更大的值,请像这样启动mysql:

shell> mysql --max_allowed_packet=32M

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

服务器的默认max_allowed_packet值为 4MB。如果服务器需要处理大查询(例如,如果要处理大BLOB列),则可以增加此值。例如,要将变量设置为 16MB,请按以下方式启动服务器:

shell> mysqld --max_allowed_packet=16M 您还可以使用选项文件设置max_allowed_packet。例如,要将服务器的大小设置为 16MB,请在选项文件中添加以下几行:

[mysqld] max_allowed_packet=16M

可以安全地增加此变量的值,因为仅在需要时才分配额外的内存。例如,mysqld仅在发出长查询或mysqld必须返回较大的结果行时才分配更多内存。变量的较小默认值是一种预防措施,可用于捕获 Client 端和服务器之间的错误数据包,并确保不会因意外使用大数据包而导致内存不足。

如果您使用的是大BLOB值,但没有授予mysqld访问足够的内存来处理查询,那么对于大数据包也可能会遇到奇怪的问题。如果您怀疑是这种情况,请尝试在mysqld_safe脚本的开头添加 ulimit -d 256000 并重新启动mysqld。

最新回复(0)