什么可能导致 MySQL 间歇性地无法返回一行?

Posted

技术标签:

【中文标题】什么可能导致 MySQL 间歇性地无法返回一行?【英文标题】:What could cause MySQL to intermittently fail to return a row? 【发布时间】:2021-04-06 15:09:22 【问题描述】:

我有一个 mysql 数据库,作为 web 应用程序的一部分,我正在运行非常简单的查询。我从今天开始收到用户的报告,他们收到一个错误,说他们的帐户不存在,当他们再次登录时,它确实存在(这种情况只发生在少数人身上,每个人只发生一次,所以很明显稀有的)。根据我的后端代码,只有当同一个查询第一次返回 0 行,第二次返回 1 行时,才会发生此错误。我的查询基本上是SELECT * FROM users WHERE username="..."。这怎么可能?我怀疑硬盘有 I/O 故障,但我不确定,因为我不希望 MySQL 在这种情况下静默失败。也就是说,我不知道还能是什么。

【问题讨论】:

经验告诉我,这可能类似于会话持久性错误或应用程序代码中难以发现的逻辑错误。如果 MySQL 出现存储故障,您会在 mysqld 服务日志中看到错误,我希望您会看到广泛的数据损坏 【参考方案1】:

这可能是您的 mysql 客户端的错误(虽然我不确定您的代码结构如何,但它可能只是错误的查询)。但是,让我们假设您的查询到目前为止一直运行良好,之前没有任何问题,因此我们将排除错误代码。

考虑到这一点,我假设它要么是您的 mysql 客户端中的错误,要么是您的最大连接数已达到(与我以前的主机 - Hostinger 有此问题)。

假设您的问题是您的 mysql 客户端中的错误,请通过运行此命令将会话设置为每个会话

SET SESSION optimizer_switch="index_merge_intersection=off";

或者在你的 my.cnf 中你可以全局设置它

[mysqld] optimizer_switch=index_merge_intersection=off

至于最大连接,您可以增加您的 max_connection 值(取决于您的主机是否允许),或者您必须制定一个逻辑以在查询执行后关闭 mysql 连接。

$mysqli->close();

【讨论】:

我认为你是对的。在运行数据库的服务器上进行了计划的网络维护,我猜测客户端可能没有正确处理断开的连接。感谢您的帮助!

以上是关于什么可能导致 MySQL 间歇性地无法返回一行?的主要内容,如果未能解决你的问题,请参考以下文章

什么会导致间歇性 SQLSTATE[HY000] [2002] Debian Lenny 上的 php PDO mysql 没有此类文件或目录错误? [复制]

什么可能导致浏览器中间歇性的ReferenceError / TypeError背后的原因?

flash.display.Loader 间歇性地导致加载的 swf 的子级松散类型

捕获Scala进程失败

Amazon S3 CORS 错误

Google Cloud Platform 上的 ndb 查询间歇性地不返回任何内容