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

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

2006, MySQL server has gone away

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


当前回答

我也遇到了这个错误。但是,即使增加了max_allowed_packet或my.cnf中的任何值,错误仍然存在。

我所做的是对我的数据库进行故障排除:

我检查了错误持续存在的表 然后我检查了每一行 有些行可以读取,有些行错误只会显示 似乎这些行中存在导致此错误的值 但是,即使只选择主列,错误仍然会出现(SELECT primary_id FROM table)

我想到的解决方案是重新导入数据库。好在我有这个数据库的备份。但是我只是删除了有问题的表,然后导入了这个表的备份。这解决了我的问题。


我对这个问题的看法是:

始终有数据库备份。手动或通过CRON作业 我注意到在受影响的行中有一些特殊字符。因此,当我恢复该表时,我立即将该表的排序规则从latin1_swedish_ci更改为utf8_general_ci 在我的数据库工作正常之前,我的系统突然遇到这个问题。也许这也与我们的主机提供商升级MySQL数据库有关。所以经常备份是必须的!

其他回答

我也有同样的问题,但改变my.ini/my.cnf文件下[mysqld]的max_allowed_packet。

添加一条线

max_allowed_packet = 500

现在重新启动MySQL服务,一旦你完成。

我遇到过这种情况很多次,我通常发现答案是max_allowed_packet的默认设置非常低。

在/etc/my.cnf(在[mysqld]下)中将它提升到8或16M通常可以修复它。(MySql 5.7的默认值是4194304,也就是4MB。)

[mysqld]
max_allowed_packet=16M

注意:如果该行不存在,只需创建该行

注意:这可以在服务器运行时设置。

注意:在Windows上,您可能需要使用ANSI而不是UTF-8编码保存my.ini或my.cnf文件。

使用set global max_allowed_packet=104857600。这将它设置为100MB。

以防这能帮助到任何人:

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

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连接。

造成这个错误的原因有几个。

MySQL / MariaDB相关:

wait_timeout—服务器在关闭连接之前等待连接激活的时间(以秒为单位)。 interactive_timeout—服务器等待交互连接的时间(以秒为单位)。 max_allowed_packet -数据包或生成/中间字符串的最大字节数。设置为最大的BLOB大小,为1024的倍数。

my.cnf的示例:

[mysqld]
# 8 hours
wait_timeout = 28800
# 8 hours
interactive_timeout = 28800
max_allowed_packet = 256M

服务器相关:

你的服务器有完整的内存-用free -h检查内存信息

框架相关:

检查框架的设置。以Django为例,使用CONN_MAX_AGE(参见docs)

如何调试它:

检查MySQL/MariaDB变量的值。 使用sql:显示变量'%time%'; 命令行:mysqladmin变量 为错误打开verbose: MariaDB: log_warnings = 4 MySQL: log_error_verbosity = 3 有关错误的更多信息,请查看文档

不太可能的情况是,在客户端和服务器之间有一个防火墙,强制TCP重置到连接中。

我遇到了这个问题,我发现我们公司的F5防火墙被配置为终止空闲超过5分钟的非活动会话。

再说一次,这是不太可能发生的情况。