【问题标题】:MySQL : Server has gone awayMySQL:服务器已消失
【发布时间】:2012-09-05 18:00:43
【问题描述】:

所以当我使用我无法解决的 PHP PDO 运行脚本时,我遇到了这个问题。我的脚本正在索引来自不同服务器上不同数据库的信息(主要是 Select 查询)。

当我开发脚本时,所有数据库都在同一台服务器上,一切都运行良好。现在我在三个不同的服务器上移动数据库,我得到了这个可怕的错误。

所以这就是我每次运行脚本时都会发生的情况:

脚本运行良好,直到运行这个简单查询的某个点(并且每次都崩溃):

(注意,脚本在PHP 中,我使用PHP PDO 访问我的数据库并使用它)

SELECT *
FROM a_table
WHERE a_column = a_value.

然后它崩溃了,我收到了这个错误:

[a_date] - trunk - FATAL - Unmanaged Exception of type 'App_Exception'
File: /.../.../.../a_php_file.php
Line: a_line
Message: Error executing query.
Info:
Array
(
    [0] => HY000
    [1] => 2006
    [2] => MySQL server has gone away
)

Trace:
 #0 /.../.../.../a_php_file.php(124): App_something::a_metho('a_variable...')

我找了很久,还是没有找到解决办法。

我试过了:

  • 修改 /etc/my.cnf 中的 max_allowed_pa​​cked (在发生崩溃的 sql 上)将其从 16M 设置为 64M(即使查询返回的结果实际上并没有那么大)。

  • 修改 max_connections 以允许更多连接,以防我忘记终止一些已经存在的连接。

  • 检查网络问题

  • 许多其他小事,例如从主机到远程 sql 服务器的连接。

真正奇怪的是,如果我单独运行查询,它运行良好,如果所有数据库都在同一台服务器上,它也运行良好。

此时我真的很迷茫,不知道问题可能出在哪里,这就是为什么我来寻求帮助或只是一个提示。

这是在异常时崩溃的方法:

public static function my_method($my_mysql_WHERE_variable)
{
    //======================================
    // cached?
    //======================================
    if(isset(self::$_table1[$my_mysql_WHERE_variable])) {
      return self::$_table1[$my_mysql_WHERE_variable];
    }

    $pdo = my_App::getConnection();

    $query = "SELECT *
              FROM
                a_table
              WHERE
                a_column = :my_mysql_WHERE_variable";
    $stmt = $pdo->prepare($query);

    if($stmt === false) { 
        **---------------IT CRASHES HERE-----------**
        throw new my_App_Exception("Error executing query.\nInfo:\n" . print_r($pdo->errorInfo(), true)); 
    }
    .
    .
    .
    return $a_value;
}

【问题讨论】:

  • 你能说明my_app::getConnection()的逻辑吗?这是某种单例吗?显示数据库连接如何关闭的逻辑也很有用。我的猜测是您遇到了连接管理问题。
  • 您好,请查看tag wiki of pdo 标记处的示例。这可能会有所帮助。
  • 谢谢 Mike 和 mtk。一旦对象(此处为 $pdo)==null 或被销毁,连接(使用 PDO)就会关闭,它位于方法范围的末尾。
  • 嗯,发生了一些奇怪的事情。在绝望的举动中,我决定尝试提高 /etc/my.cnf 文件中的超时值。现在,该脚本已经设法比它通常崩溃的地方更远了。它仍在运行,将让它去看看它是否完成。如果是这样,我将重新启动它以查看更改超时值是否是关键。现在,奇怪的是,我在循环中执行的查询通常每次花费不到几分之一秒......嗯。

标签: php mysql pdo mysql-error-2006


【解决方案1】:

您可能遇到了数据库连接问题。您是否不小心在其他地方关闭了与该数据库的数据库连接?您没有为您尝试运行的查询引用正确的连接吗?

【讨论】:

  • 感谢您抽出宝贵时间迈克。我将编辑我的主要帖子,向您展示该方法的作用。我不是专业的 PHP 开发人员,但我很高兴,因为我正在处理堆栈,所以应该没问题,并且所有连接都在方法范围的末尾关闭。
【解决方案2】:

我发现这个错误的原因是因为有一个tcp连接超时。即使查询实际上很短,我仍然无法真正解释为什么它会超时,但我设法通过修改 /etc/sysctl.conf 并为 keepalives 设置更高的值来解决我的问题。当然,我知道真正的解决方案是读取每个查询,并尝试优化它们:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 2011-06-07
    • 2010-12-20
    • 2013-06-13
    • 2015-01-15
    • 2016-03-06
    • 2017-04-02
    相关资源
    最近更新 更多