在MySQL错误日志中,我看到了如下这样的警告:

120611 16:12:30 [Warning] Aborted connection 2619503 to db: 'db_name' user: 'user_name' host: 'webapp_hostname' (Got an error reading communication packets)


还没有发现任何数据丢失,所以我想知道这个警告是什么手段或原因,以及是否可以解决造成这些问题的问题。这是在RHEL 6.1和MySQL Enterprise 5.5上。

#1 楼

MySQL数据包是MySQL连接的无声杀手之一。

首先,让我们弄清楚MySQL数据包是什么。

根据“了解MySQL内部知识”的第99页(ISBN 0-596-00957-7),以下是第1-3段,解释了MySQL数据包:


MySQL网络通信代码是在以下前提下编写的:
查询总是相当短,因此可以一整块地发送到服务器并由服务器进行处理,在MySQL术语中称为数据包。服务器为临时缓冲区分配
内存以存储该数据包,并且它请求足够
使其完全适应。此体系结构
需要采取预防措施,以免服务器耗尽内存-对该数据包的大小设置上限
,此
选项可以实现此目的。

与该选项相关的感兴趣的代码可在sql / net_serv.cc中找到。看一下my_net_read(),然后跟随对my_real_read()的调用,并特别注意
net_realloc()。

此变量还限制了长度
包含许多字符串函数的结果。
有关详细信息,请参见sql / field.cc和
sql / intem_strfunc.cc。


了解有关MySQL数据包的信息允许开发人员/ DBA对其进行大小调整,以容纳一个包内的多个BLOB,即使它们太大得令人讨厌。毫无疑问,数据包太小会在这方面引起开放连接的问题。

根据MySQL文档



如果您向服务器发送不正确或太大的查询,也会收到这些错误。如果mysqld收到的数据包太大或顺序混乱,则认为客户端出了点问题,并关闭了连接。如果需要大型查询(例如,如果使用大型BLOB列),则可以通过设置服务器的max_allowed_pa​​cket变量来增加查询限制,该变量的默认值为1MB。您可能还需要增加客户端上的最大数据包大小。有关设置数据包大小的更多信息,请参见第C.5.2.10节“数据包太大”。
插入很多行的INSERT或REPLACE语句也可能导致此类错误。这些语句中的任何一个都将单个请求发送到服务器,而与要插入的行数无关。因此,通常可以通过减少每个INSERT或REPLACE发送的行数来避免该错误。

建议

尝试将max_allowed_pa​​cket增大到更大的数字,因为默认值为1M。我建议您使用当前数据集中最大的TEXT或BLOB字段大约10倍。

要将max_allowed_pa​​cket设置为256M,可以将其添加到/etc/my.cnf或my.ini

[mysqld]
max_allowed_packet=256M


涵盖了mysqld将来的重启。要立即在服务器上安装该值,请运行以下命令:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;


试试看!

评论


很好的解释。

– Vasilis Lourdas
2012年6月12日19:50

@RolandoMySQLDBA在尝试所有提到的解决方案后,我仍然在5.7.28中出错。任何进一步解决问题的技巧

– ImranRazaKhan
20年1月18日在13:49

#2 楼

通常,默认情况下max_connections为100。在my.cnf中进行设置后,尝试增加config参数

max_connections = 400重新启动服务器,或动态设置它:

    set @@global.max_connections = 400;


请尝试上述建议以避免此警告消息,并确保您的网络没有数据包丢失。

#3 楼

从MySQL Enterprise 5.1.x迁移到5.7.x之后,我最近遇到了这个问题,但没有对应用程序进行任何重大代码更改,开始出现“注释”。

就我而言,出现“便笺”的根本原因是程序在连接仍然打开的情况下退出。未关闭连接的情况稍微复杂一些,与MySQL无关,但与ACE,线程和TSS有关。

#4 楼

这里没有提到,所以我包括了这个问题的另一个原因。就我而言,使用mysql命令行客户端时,错误是由interactive_timeout的30秒的低值引起的:https://dev.mysql.com/doc/refman/8.0/en/server-system-variables。 html#sysvar_interactive_timeout
在会话之间将持续存在,但不会重新启动服务器。

SET GLOBAL interactive_timeout=6000;


#5 楼

我在MariaDB 10.3.24中遇到了相同的问题。由于以上所有原因,然后可能是某些原因,似乎可能会出现警告。在我的情况下,这是由于其中一个数据库表中的记录中的一个字段具有空的字典值。
+ ---- + -------- +
| id | config |
+ ---- + -------- +
| 3 | {} |
+ ---- + -------- +
作为测试,我将'{}'更改为'()',并停止了消息。
以防万一可以帮助某人。

#6 楼

此my.ini行解决了我的问题:

log_error_verbosity=1


引用此链接

评论


我认为您尚未解决根本的问题,但只是停止了对其进行记录。

–user19292
16年1月8日在12:22

我有同样的消息报告为“注释”。使用log_error_verbosity = 2实际上可以解决“问题”(但应解决而不是忽略“警告”)

– xtian
16-10-5在20:44