【问题标题】:Gearman, ZF2, Doctrine2, MySQL, SQLSTATE[HY000]: General error: 2006 MySQL server has gone awayGearman、ZF2、Doctrine2、MySQL、SQLSTATE[HY000]:一般错误:2006 MySQL 服务器已消失
【发布时间】:2015-01-23 14:18:18
【问题描述】:

我使用 ZF2、Doctrine2、MySQL、Gearman。 Gearman 工作时周期性报错:

SQLSTATE[HY000]:一般错误:2006 MySQL 服务器已消失。

我尝试了以下步骤来解决问题:

1) 我调查了 MySQL 查询。 查询没有任何问题。它很简单(没有子查询)而且速度很快。 例如,这是 MySQL 服务器消失时查询之一的 EXPLAIN。

+-------------+-------+-------+-----------------------+-----------------------+---------+-------+------+
| select_type | table | type  |     possible_keys     |          key          | key_len |  ref  | rows |
+-------------+-------+-------+-----------------------+-----------------------+---------+-------+------+
| SIMPLE      | t0    | const | UNIQ_8D93D649E7927C74 | UNIQ_8D93D649E7927C74 |     767 | const |    1 |
| SIMPLE      | t13   | const | UNIQ_BA388B79395C3F3  | UNIQ_BA388B79395C3F3  |       5 | const |    1 |
+-------------+-------+-------+-----------------------+-----------------------+---------+-------+------+

2) 我尝试了this post 的版本(用于重新连接到数据库)但这对我没有帮助。我的一些查询丢失了。

3) 我禁用了所有 Gearman 作业和工人,除了 3 进行测试。我清理了 Gearman 队列并重新启动 Gearman 服务器和 Gearman 工作人员。但这对我没有帮助。

4) 我为 MySQL 启用了这些设置: max_allowed_pa​​cket = 500M

   max_connections      = 2000
   max_user_connections = 300
   wait_timeout         = 3600
   net_read_timeout     = 3600

有人可以帮忙吗? 谢谢!

【问题讨论】:

  • 可以看看MySQL慢查询日志有什么线索吗?这通常发生在数据库繁忙、运行备份、转储或类似情况时。
  • 我清理了我的数据库。数据库只有 5 行用于测试并且我关闭了转储。没用
  • 不管怎样,你启用了 MySQL 慢查询日志,有什么问题吗?或者查看 MySQL 文档,它看起来像数据库问题 - dev.mysql.com/doc/refman/5.5/en/gone-away.html
  • “消失”错误意味着与数据库的连接已超时。这在处理长时间运行的作业时很常见。要修复它,只需在工作开始时重新连接到数据库。

标签: doctrine-orm zend-framework2 gearman


【解决方案1】:

每个工作脚本都应该在开始时连接到数据库并在结束时断开连接。不要尝试保持打开连接,就好像 MySQL 超时一样,那么您的脚本不会注意到这就是您收到错误的原因。

【讨论】:

    【解决方案2】:

    这是我在博文中描述的解决方案(俄语,你可以用谷歌翻译)。

    http://seyferseed.ru/php/reshenie-problemy-doctrine-2-i-mysql-server-has-gone-away.html

    我正在使用此代码解决 MySQL 服务器已消失

    的问题
    public function disconnect()
    {
        $this->getEm()->getConnection()->close();
    }
    
    public function connect()
    {
        $this->getEm()->getConnection()->connect();
    }
    
    /**
     * MySQL Server has gone away
     */
    public function reconnect()
    {
        $connection = $this->getEm()->getConnection();
        if (!$connection->ping()) {
    
            Debug::vars("MySQL ping failed");
    
            $this->disconnect();
            $this->connect();
    
            $this->checkEMConnection($connection);
        }
    }
    
    /**
     * method checks connection and reconnect if needed
     * MySQL Server has gone away
     *
     * @param $connection
     * @throws \Doctrine\ORM\ORMException
     */
    protected function checkEMConnection($connection)
    {
        if (!$this->getEm()->isOpen()) {
            $config = $this->getEm()->getConfiguration();
    
            $this->em = $this->getEm()->create(
                $connection, $config
            );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多