我正在办公室运行一台服务器来处理一些文件,并将结果报告给远程MySQL服务器。

文件处理需要一段时间,进程中途死亡,并出现以下错误:

2006, MySQL server has gone away

我听说过MySQL的设置,wait_timeout,但是我需要在我办公室的服务器或远程MySQL服务器上更改它吗?


当前回答

对于Vagrant Box,请确保为该Box分配了足够的内存

config.vm.provider "virtualbox" do |vb|
  vb.memory = "4096"
end

其他回答

这通常表示MySQL服务器连接问题或超时。 通常可以通过更改my.cnf或类似文件中的wait_timeout和max_allowed_packet来解决。

我建议以下几点:

Wait_timeout = 28800

max_allowed_packet = 8M

对我来说是内存问题。

我甚至在拥有12个CPU核心和32 GB RAM的服务器上也遇到了同样的问题。我做了更多的研究,试图释放RAM。下面是我在Ubuntu 14.04上使用的释放RAM的命令:

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

而且,它修复了一切。我把它设置在cron下,每小时运行一次。

crontab -e

0 * * * * bash /root/ram.sh;

并且,你可以使用这个命令来检查有多少可用的空闲RAM:

free -h

你会得到这样的结果:

             total       used       free     shared    buffers     cached
Mem:           31G        12G        18G        59M       1.9G       973M
-/+ buffers/cache:       9.9G        21G
Swap:         8.0G       368M       7.6G

我的问题是我为生产连接添加了SSL配置,这破坏了我的本地环境。很简单,但可能会帮助其他人意识到他们的问题。

检查连接是否存在并在需要时重新建立连接可能更容易。

有关这方面的信息,请参阅PHP:mysqli_ping。

以防这能帮助到任何人:

当我打开和关闭将从应用程序的几个部分调用的函数中的连接时,我得到了这个错误。 我们获得了太多的连接,所以我们认为重用现有的连接或将其丢弃并创建一个新的连接可能是一个好主意,如下所示:

public static function getConnection($database, $host, $user, $password){
    if (!self::$instance) {
        return self::newConnection($database, $host, $user, $password);
    } elseif ($database . $host . $user != self::$connectionDetails) {
        self::$instance->query('KILL CONNECTION_ID()');
        self::$instance = null;
        return self::newConnection($database, $host, $user, $password);
    }
    return self::$instance;
}

事实证明,我们在kill方面做得有点太彻底了,所以在旧连接上做重要事情的进程永远无法完成他们的业务。 所以我们去掉了这些线

self::$instance->query('KILL CONNECTION_ID()');
self::$instance = null;

由于机器的硬件和设置允许,我们增加了服务器上允许的连接数

max_connections = 500

到我们的配置文件。这解决了我们现在的问题,我们学到了一些关于杀死mysql连接。