在 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 上。
MySQL 连接的沉默杀手之一是 MySQL 数据包。
首先,让我们弄清楚 MySQL Packet 是什么。
根据"Understanding MySQL Internals" (ISBN 0-596-00957-7) 的第 99 页,这里是解释 MySQL 数据包的第 1-3 段:
了解有关 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_connections
为 100。尝试将配置参数增加到max_connections=400
.在重新启动服务器后设置
my.cnf
,或者您可以动态设置它:只需尝试上述建议以避免此警告消息,并确保您的网络没有丢包。
我最近从 MySQL Enterprise 5.1.x迁移到5.7.x后遇到了这个问题,没有对应用程序进行任何重大的代码更改,“注释”开始出现。
在我的情况下,出现“ note ”的根本原因是程序退出时连接仍然打开。未关闭连接的情况涉及更多,与 MySQL 无关,而是与 ACE、线程和 TSS 相关。
这里没有提到,所以我包括了这个问题的另一个原因。就我而言,在使用 mysql 命令行客户端时,错误是由 30 秒的低值引起的
interactive_timeout
:https ://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html #sysvar_interactive_timeout
这将在会话之间持续存在,但不会在服务器重新启动时持续存在。
我在 MariaDB 10.3.24 中遇到了同样的问题。
似乎警告可能由于此处提到的所有其他原因而发生,然后是一些原因。
在我的情况下,这是由于其中一个数据库表中的记录具有一个字段的空字典值。
作为测试,我将其更改
{}
为()
并停止了消息。以防万一它帮助某人。我通过执行返回多行的查询得到了同样的错误,然后使用 rows.Next()(在 Golang 中)处理这些行,并且由于不相关的错误而提前退出而不调用 rows.Close()。令人困惑的部分是它在前几次工作,但最终失败,表明一些资源(连接?)正在被用完。
我能够利用 Golang 的 defer 语句,然后做
推迟行。关闭()
在调用 rows.Next() 之前,但在每次提前退出 rows.Next() 循环之前调用 rows.Close() 也可以。
这个 my.ini 行临时解决了我的问题:
参考这个链接