查询导致 mysql 服务器消失

查询导致 mysql 服务器消失

我们有一个已部署到 50 多个网站的应用程序。在这些网站上,我们注意到了一些奇怪的行为,现在我们已将其追踪到一个特定的查询。偶尔,通常一天一两次,我们的一个调试脚本会报告

2006 : MySQL server has gone away

我知道引发此错误的原因有很多,但最奇怪的是,每次引发此错误时,都是由正在运行的同一条 SQL 查询引发的。此查询并没有什么奇怪或复杂的,它看起来像这样:

SELECT `advert_only` FROM `products` WHERE `id` = '6197'

此查询每天必须针对各种不同的产品 ID 运行数万次,因此它肯定不会每次都失败。它在我们的 4 台服务器上看似随机的网站上随机失败。似乎没有共同点,我们注意到的一个小问题是,它有时会在 1 个特定人员连续 2 或 3 次页面加载时发生,因为我们还会跟踪发生这种情况的人的 IP。

这是在运行 MySQL 5.0.81 的 CentOS 5 服务器上

答案1

该死,我的名声太差了!我无法在上面发布问题/评论。所以很抱歉这不是答案,但希望它能引导你走向正确的方向。

您是否更新了产品表?您是否看到任何关联?您是否能够在没有锁的情况下运行 SELECT,读取未提交的行?

如果您不需要将查询限制为已提交的数据,则应在选择之前包含此语句以避免锁定问题:

set transaction isolation level READ UNCOMMITTED;

此外,以防“消失”消息与性能有关,您是否在“id”列上有索引?

答案2

我认为,错误与该查询仅部分相关。也许产品表非常大并且发生超时(??)。也许您应该检查索引是否碎片化。

请参阅此链接了解可能的原因:http://dev.mysql.com/doc/refman/5.1/en/gone-away.html 请参阅此链接以了解碎片整理:http://dev.mysql.com/doc/refman/5.1/en/innodb-file-defragmenting.html

答案3

我预计它崩溃了或者你的应用服务器和 mysql 服务器之间有网络问题。

如果服务器崩溃,您会在日志中看到很多消息。您在日志中看到什么了吗?

如果您运行的是 32 位系统,崩溃可能是由于地址空间不足引起的,因为您在调整时没有考虑地址空间。不要调整虚拟内存使用量 > 2G,否则您就会遇到麻烦。

如果可以避免,请不要运行 32 位 MySQL。

相关内容