PHP站点中突然出现“MySQL服务器已消失”错误

Posted

技术标签:

【中文标题】PHP站点中突然出现“MySQL服务器已消失”错误【英文标题】:Sudden "MySQL server has gone away" error in PHP site 【发布时间】:2010-12-25 10:36:14 【问题描述】:

今天我的一个网站开始显示

错误号:2006
mysql 服务器已消失

这是一个在 Apache 2.2.9 (Debian)、php 5.2.6-1+lenny3(使用 CodeIgniter 1.7.1 框架)和 MySQL 5.0.51a 下运行的低流量客户端站点。我显然对错误进行了重新搜索,但所有可能的解决方案都意味着正在进行的大查询可能会超时并重置连接,或者达到数据包限制。然而,情况并非如此,它是一个用最简单的查询处理的小型数据库。为了确定这一点,我做了一些查询以返回一行,但仍然是同样的错误。

数据库凭据很好,我什至可以直接登录 mysql,运行网站的一些查询并立即获取正确的数据。同一台服务器上还有几个其他站点和数据库连接,更大的站点,它们都没有问题。

我试过了:

重启 MySQL 重启整个服务器 在日志中查找错误(Apache 和 MySQL,无) 检查数据库用户权限 在 PHP 中更改 mysql.connect_timeoutdefault_socket_timeout 在 MySQL 中更改 max_allowed_packet 阅读official docs、论坛和 SO 中所有“MySQL 服务器已消失”的内容

新功能:

在 PHP 中禁用持久连接 在 MySQL 中更改 wait_timeoutconnect_timeout

更新:

这似乎与我的脚本的执行时间有关:它使用 Facebook PHP 客户端检索一些信息,并且这个调用今天似乎随机失败,所以我要么没有来自 Facebook 的数据,要么是 MySQL 错误。但令我惊讶的是,给定的解决方案似乎都没有处理超时。

有什么想法吗?感谢您的宝贵时间!

【问题讨论】:

Apache 和 MySQL 在同一个盒子上吗?如果您创建一个简单的 PHP 页面来运行一个简单的查询(例如 SELECT VERSION();),那会起作用吗? @Eric J:是的,令我惊讶的是,第二个也是如此,这似乎是框架带来的问题.. 您可以发布生成的查询输出吗?我假设这是通过 CodeIgniter 进行的。您是否有机会使用 InnoDB 或异国代码页? @Pestilence 是的,我可以,但这只是一些行,没有太多麻烦。我在所有 dbs/tables 上使用 MyISAM 和 UTF-8。 【参考方案1】:

正如我在更新中所说,我得出的结论是,当链接到 Facebook 的时间超过与数据库的最大连接时间时,MySQL 就会出现问题。没有任何建议可以超越这个限制,所以我决定解决它,并在每次我认为链接可能消失时重新连接。

所以每次调用 Facebook 后,我都会使用以下代码:

$this->load->database();
$this->db->reconnect();

这是使用 CodeIgniter 时的特殊解决方案,并且 AFAIK db->reconnect() 函数仅在 1.7.2 版本后可用,因此我对其进行了更新以使其正常工作。

感谢大家的回答!

【讨论】:

嗨,我遇到过这种问题,解决方案是改变您网站的架构,您永远无法保证 facebook 会在一定时间内回复,而且从 facebook 获取的值/数据也会永远不会是最新的。我们所做的是做一个单独的 chron 工作来从 facebook 获取数据 我也有同样的问题,但是这不起作用,自 2009 年以来有什么变化吗? 我在这里有 500 分的赏金,我想知道您是否认为您的经验相关并且可以提供帮助:***.com/q/53469793/470749【参考方案2】:

这可能是连接超时影响了您在 PHP 中的持久连接。我以前经常看到他们。超时参数在 MySQL 内部。

您的选择包括: - 不使用持久连接 - 关闭 MySQL 服务器上的空闲超时 - 捕获错误

我总是将重新连接包装到我自己的 PDO 类中,所以我什至不记得 PHP 是否重新连接。无论如何,这很容易解决。查询、捕获并重新连接。

我过去曾在 InnoDB 中“生成”过此错误。如果您使用的是该引擎,失败后SHOW ENGINE INNODB STATUS 的输出是什么?

【讨论】:

禁用持久连接没有任何区别,但关闭空闲超时(将 MySQL 的 wait_timeout 和 connect_timeout 归零,对吗?)似乎解决了这个问题。但是,我担心这可能会产生负面影响,例如永无止境的 MySQL 进程,对吗?另外,“捕获错误”是什么意思?我没有对代码做任何事情,数据库数据也没有改变,这是一个一夜之间的问题,这就是奇怪的事情。谢谢! 好的,问题仍然存在,但我找到了一个规律。我会更新问题。 归零 mysql 的超时可能会对故障网络产生负面影响。嗯,捕获错误将涉及您框架的数据库处理程序中的一些自定义......或者一个巨大的catch(),连接并重试。奇怪的是,禁用持久连接并没有解决问题。 其实...你在这个 MySQL 机器上使用复制吗? 不,我做过一次只是为了迁移服务器。我已经更新了问题,现在罪魁祸首似乎更清楚了。【参考方案3】:

由于其他站点正常工作,我们可以假设它与您的站点(而不是服务器)相关。官方文档提到,如果您在服务器连接关闭后尝试执行查询,则可能会发生这种情况。您在 CodeIgniter 中是否有任何钩子可以在数据库连接可能关闭的请求结束时执行某些操作?

【讨论】:

不,我在 CodeIgniter 或数据库中没有任何钩子【参考方案4】:

您提到这是一项通宵任务,并且您正在获取 FaceBook 数据等。该进程是否运行了很长时间?

我最近有一个脚本,它将数据从一个集群移动到另一个集群并转换格式等。这个脚本运行 24/7 移动这些数据。我发现不管有没有持久连接,MySQL 库仍然会在几分钟后退出(有时 5 分钟,有时更长)。

我发现解决此问题的唯一方法是在我的包装器中进行时间检查,并检查自上次在执行查询之前重新连接以来已经过去了多长时间。我已将其设置为检查是否超过 2 分钟,如果是,则重新建立连接,确保将 mysql_connect 上的“new_link”标志(第 4 个参数)设置为 false。

自从更改此设置后,我再也没有遇到同样的错误。

【讨论】:

感谢卢卡斯的输入,但有一个误解,我的意思是问题是在一夜之间产生的,意思是它是突然的,没有明显的原因。由于 Facebook TOS,任务本身(数据检索和数据库内容)几乎是在每次页面加载时完成的。 您是否立即收到错误信息 - 即在您浏览网页时立即收到错误信息?还是脚本运行一定时间后失败的情况? 它可能会立即失败或在脚本中间失败,具体取决于错误的原因。现在我的回答中已经详细说明了:)

以上是关于PHP站点中突然出现“MySQL服务器已消失”错误的主要内容,如果未能解决你的问题,请参考以下文章

解决“MySQL 服务器已消失”错误

安装迁移期间mysql服务器已消失错误(laravel)

MAMP ";#2006的解决方案-MySQL服务器已消失";错误

phpMyAdmin 中的 MySQL “#2006 - MySQL 服务器已消失”

PHP 警告:在 macOS 终端中 MySQL 转储后“MySQL 服务器已消失”

Mysql2 错误 MySQL 服务器已消失