MySQL中断连接 -- 如何查找原因

5

我正在尝试调试一个PHP问题,我认为我找到了一个可能的罪魁祸首。Mysql中有中止的连接。

在mysql日志中是否有任何信息可以帮助我确定连接断开/原因?(我有单独的DB + web服务器)

mysql> SHOW GLOBAL STATUS;
+------------------------------------------+--------------+
| Variable_name                            | Value        |
+------------------------------------------+--------------+
| Aborted_clients                          | 150          |
| Aborted_connects                         | 86496        |

你有检查 MySQL 日志是否有错误吗?我认为这个问题应该会有一些错误信息。或者也可能在 PHP 错误日志中。请看一下。如果你正在使用 Apache2 Web 服务器,那么错误日志的默认位置是 /var/log/apache2/error.log,而 MySQL 的位置是 /var/log/mysql.err - rsz
mysqld.log(我的错误日志)没有显示任何我可以找到的内容。 我还检查了apache日志,里面也没有任何内容。 我正在使用new relic进行监控,并注意到一些非常奇怪的错误可能与连接中断有关。 Aborted_client和Aborted_connects是否表示已断开的连接? 这发生在多长时间内? - Chris Muench
可能会有几种原因,比如网络错误、数据库服务器错误或者就像你所说的一些 PHP 错误。如果没有更具体的错误消息,就很难判断。 - rsz
在我的情况下,这是一个心跳监测脚本,它只是测试打开到mysql服务器的套接字。虽然该脚本确保关闭套接字,但根据mysql的定义,可能不够“适当”;因为在停止后,计数不再增加。 - mshsayem
1个回答

9
Aborted_connects指的是尝试连接但失败的客户端。通常这是由于凭据不正确(密码错误或用户没有匹配的主机)引起的。
我建议先打开--log-warnings如文档所述,并检查错误日志以帮助找到频繁连接失败的罪魁祸首。
中止连接也可能是由于客户端尝试使用无效或格式不正确的连接字符串而导致的。例如,一些监视应用程序只检查mysql端口的连通性,可能会触发此问题。这篇博客文章提供了一些使用数据包级别监视来尝试定位问题的示例。 Aborted_clients是客户端未正确关闭连接。PDO和MySQLi都提供方法,在脚本完成后正确关闭连接。

1
我进行了TCP抓包,当我注意到中止连接增加时,我停止了它。看起来是某种监控服务触发了该错误。我仍在努力弄清楚中止客户端的问题。 - Chris Muench
1
FWIW - 另一个常见的连接中止原因是达到了 max_connections 限制。在该限制被提高或连接数低于限制之前,每次连接尝试都将被中止。(这和其他原因将在错误日志中很容易地显示出来。) - user2281015
1
又是一个关于客户端被杀的错误案例。我们有一个设置,不允许请求超过30秒,因此如果工作进程(ruby、独角兽)在30秒后被杀死,则mysql日志中会出现这一行。 - Victor Ivanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接