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_packet变量来增加查询限制,该变量的默认值为1MB。您可能还需要增加客户端上的最大数据包大小。有关设置数据包大小的更多信息,请参见第C.5.2.10节“数据包太大”。
插入很多行的INSERT或REPLACE语句也可能导致此类错误。这些语句中的任何一个都将单个请求发送到服务器,而与要插入的行数无关。因此,通常可以通过减少每个INSERT或REPLACE发送的行数来避免该错误。
建议
尝试将max_allowed_packet增大到更大的数字,因为默认值为1M。我建议您使用当前数据集中最大的TEXT或BLOB字段大约10倍。
要将max_allowed_packet设置为256M,可以将其添加到/etc/my.cnf或my.ini
[mysqld]
max_allowed_packet=256M
涵盖了mysqld将来的重启。要立即在服务器上安装该值,请运行以下命令:
SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;
试试看!
#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
评论
很好的解释。
– Vasilis Lourdas
2012年6月12日19:50
@RolandoMySQLDBA在尝试所有提到的解决方案后,我仍然在5.7.28中出错。任何进一步解决问题的技巧
– ImranRazaKhan
20年1月18日在13:49