【问题标题】:Mysql error: Mysql server has gone awayMysql错误:Mysql server has gone away
【发布时间】:2017-05-31 07:42:20
【问题描述】:

我正在开发一个 Symfony 3.1 应用程序,它基本上将作业消息放在 RabbitMQ 队列中,并通过主管,我生成了一些消耗 RabbitMQ 消息的进程并执行在 Symfony 中管理的作业。消费者的工作是解码消息并创建一个新的Symfony\Bundle\FrameworkBundle\Console\Application,注入相同的内核并执行一个具有读/写数据库操作的 Symfony 命令。

问题从这里开始。通常,同时,我通常会留下 4 个工作进程来使用消息。同时,所有消费者都使用不同的数据执行相同的数据库操作,因此基本上所有进程都执行相同的 Symfony RabbitMQ 消费者。有时它工作得很好,没有任何问题,但有时 MySQL 返回错误"MySQL server has gone away",通常要解决这个问题,我必须重新启动主管服务,以便工作进程被杀死并再次产生。通常在重新启动后它可以正常工作几个小时,但它的模式确实无法预测。

这不是 MySQL 连接超时,因为我确定它们是小型操作,并且我增加了 MySQL 的 connect_timeout。我也将wait_timeout 增加到 2 天,所以基本上这并不能解决问题。

【问题讨论】:

    标签: php mysql symfony rabbitmq supervisord


    【解决方案1】:

    我们在通过命令行处理应用程序时遇到了类似的问题,尝试调整 mysql 所有变量都在适当的范围内,但不断弹出“Mysql 消失错误”。

    唯一对我们有用的解决方法是在应用程序中的任何查询之前 ping 连接并关闭挂起且不活动的连接,然后创建一个新连接。

    if ($this->em->getConnection()->ping() === FALSE) {
                    $this->em->getConnection()->close(); // Close any previous connection as they are not active
                    $this->em->getConnection()->connect(); // Get a fresh connection
                }
                $reseller = $this->em
                    ->getRepository(User::class)
                    ->findOneBy([
                        'id'   => $id,
                    ]);
    

    学说库中也提到:https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Connection.php#L1649

    【讨论】:

    • 现在最好捕获“ConnectionLost”异常并根据查询进行处理。 github.com/doctrine/dbal/pull/4119 重试和重新连接丢失的连接现在会自动发生,ping() 将在 DBAL 3 中删除。
    【解决方案2】:

    这可能是其中的一些问题。

    1. 最大数据包大小,您可以从配置 max_allowed_pa​​cket max_allowed_packet 增加它

    2. 也可能是超时问题,因为你打开了php进程,它永远不会结束,你可以执行一些try catch块,当你有一个mysql错误时,创建一个新的mysql连接。

    【讨论】:

    • 我陷入了类似的境地。什么对你有用?
    【解决方案3】:

    我们在使用应用程序时遇到了类似的问题。此错误可能有多种原因。

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 2019-10-13
      • 2013-12-16
      • 2011-12-11
      • 2011-02-04
      • 2020-05-19
      • 2016-02-15
      • 2012-12-19
      • 2016-01-19
      相关资源
      最近更新 更多