MySQL错误2006:MySQL服务器已经离开

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

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

2006, MySQL server has gone away

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

602522 次浏览

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

相关信息请参见PHP: mysqli_ping

错误:2006 (CR_SERVER_GONE_ERROR)

消息:MySQL服务器已经消失了

通常,您可以重试连接,然后再次执行查询来解决这个问题-在完全放弃之前尝试3-4次。

我假设您正在使用PDO。如果是这样,那么您将捕获PDO异常,增加一个计数器,然后在计数器低于阈值时再次尝试。

如果你有一个导致超时的查询,你可以执行以下命令来设置这个变量:

SET @@GLOBAL.wait_timeout=300;
SET @@LOCAL.wait_timeout=300;  -- OR current session only

其中300是您认为查询可能花费的最大时间的秒数。

如何处理Mysql连接问题的进一步信息

编辑:你可能还想使用的另外两个设置是net_write_timeoutnet_read_timeout

如果你知道你要离线一段时间,你可以关闭连接,进行处理,重新连接并撰写报告。

我遇到过这种情况很多次,我通常发现答案是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。

在MAMP(非专业版)中我添加了

--max_allowed_packet=268435456

...\MAMP\bin\startMysql.sh

演职员表和更多细节在这里

我也遇到了同样的问题,但是在[mysqld]下的my.ini/my.cnf文件中改变max_allowed_packet就成功了。

添加一条线

max_allowed_packet = 500

现在restart the MySQL service一旦你完成。

此错误是由于wait_timeout过期引起的。

去mysql服务器检查它的wait_timeout:

mysql>显示像'wait_timeout'这样的变量

< p > mysql>设置全局wait_timeout = 600 # 10分钟或最大等待时间 你需要

http://sggoyal.blogspot.in/2015/01/2006-mysql-server-has-gone-away.html

在你的my.ini/my.cnf中取消注释下面的ligne,这将把你的大文件分成更小的部分

# binary logging format - mixed recommended
# binlog_format=mixed

# binary logging format - mixed recommended
binlog_format=mixed
在windows上,那些使用xampp的人应该使用这个路径xampp/mysql/bin/my.ini,并将max_allowed_packet(在section[mysqld]下)更改为您选择的大小。 如< / p >
max_allowed_packet=8M

再次在php.ini(xampp/php/php.ini)更改upload_max_filesize选择大小。 如< / p >

upload_max_filesize=8M

让我头疼了一段时间,直到我发现这个。希望能有所帮助。

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

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

我在MySQL命令行中使用了以下命令来恢复一个超过7GB的MySQL数据库,它是有效的。

set global max_allowed_packet=268435456;

在我的情况下,它是低值open_files_limit变量,这阻止了mysqld访问数据文件。

我用:

mysql> SHOW VARIABLES LIKE 'open%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 1185  |
+------------------+-------+
1 row in set (0.00 sec)

在我将变量改为大值后,我们的服务器再次活跃起来:

[mysqld]
open_files_limit = 100000

我在DigitalOcean Ubuntu服务器上也出现了同样的错误。

我尝试改变max_allowed_packet和wait_timeout设置,但他们都没有修复它。

原来我的服务器内存不足。我增加一个1GB的交换文件,这解决了我的问题。

free -h检查你的记忆,看看这是否是导致它的原因。

对我来说是内存问题。

我甚至在拥有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

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

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

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

我找到了“#2006 - MySQL服务器已经消失”这个错误的解决方案。 解决方案是检查两个文件

  1. config.inc.php
  2. config.sample.inc.php

这些文件在windows下的路径为

C:\wamp64\apps\phpmyadmin4.6.4

在这两个文件中this的值:

$cfg['Servers'][$i]['host']must be 'localhost' .

我的情况是:

$cfg['Servers'][$i]['host'] = '127.0.0.1';

改为:

"$cfg['Servers'][$i]['host']" = 'localhost';

两方面都要确保:

  1. config.inc.php
  2. Config.sample.inc.php文件必须是'localhost'。

最后一组:

$cfg['Servers'][$i]['AllowNoPassword'] = true;

然后重新启动Wampserver。


修改phpmyadmin用户名和密码

可以直接通过config.inc.php文件修改phpmyadmin的用户名和密码

这两条线

$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';
这里你可以输入新的用户名和密码。 修改后保存文件并重新启动WAMP服务器

我在Ubuntu桌面上的不同MySQL客户端软件中得到了2006年错误消息。原来我的JDBC驱动程序版本太旧了。

这可能是.sql文件大小的问题。

如果您正在使用xampp。打开xampp控制面板->单击MySql配置->打开my.ini。

增加数据包大小。

max_allowed_packet = 2M -> 10M

如果您正在使用64Bit WAMPSERVER,请搜索多次出现max_allowed_packet,因为WAMP使用[wampmysqld64]下设置的值,而不是[mysqldump]下设置的值,这对我来说是问题所在,我更新了错误的一个。将其设置为max_allowed_packet = 64M。

希望这能帮助其他wampserver用户。

对于使用XAMPP的用户,在C:\ XAMPP \mysql\bin\my.ini中有2个max_allowed_packet参数。

这通常表示MySQL服务器连接问题或超时。 通常可以通过在my.cnf中更改wait_timeoutmax_allowed_packet来解决。

我建议以下几点:

Wait_timeout = 28800

max_allowed_packet = 8M

检查Mysql服务器的日志总是一个好主意,因为它消失的原因。

它会告诉你的。

发生这种错误主要有两个原因。

  1. 你的内存太小了。
  2. 尝试连接时,数据库连接将被关闭。

您可以尝试下面的代码。

# Simplification to execute an SQL string of getting a data from the database
def get(self, sql_string, sql_vars=(), debug_sql=0):
try:
self.cursor.execute(sql_string, sql_vars)
return self.cursor.fetchall()
except (AttributeError, MySQLdb.OperationalError):
self.__init__()
self.cursor.execute(sql_string, sql_vars)
return self.cursor.fetchall()

不管背后的原因是什么,它都能减轻错误,尤其是第二个原因。

如果是由低RAM引起的,则必须从代码或数据库配置提高数据库连接效率,或者仅仅提高RAM。

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

MySQL / MariaDB相关:

  • wait_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(参见文档)

如何调试它:

  • 检查MySQL/MariaDB变量值。
    • 使用sql: SHOW VARIABLES LIKE '%time%';
    • 命令行:mysqladmin variables
    • 李< / ul > < / >
    • 为错误打开verbose:
如果你使用XAMPP,有一个更简单的方法。 打开XAMPP控制面板,点击mysql部分的config按钮 enter image description here < / p >

现在点击my.ini,它将在编辑器中打开。将max_allowed_packet更新为所需的大小。

enter image description here

然后重新启动mysql服务。在Mysql服务上单击stop,再次单击start。等几分钟。 enter image description here enter image description here < / p >

然后再次运行Mysql查询。希望它能起作用。

MAMP 5.3,你不会找到my.cnf,添加它们不工作,因为max_allowed_packet存储在变量中。

一种解决方案是:

  1. http://localhost/phpmyadmin
  2. 转到SQL选项卡
  3. 运行SHOW VARIABLES并检查值,如果值小,则运行大值
  4. 执行以下查询,it set max_allowed_packet to 7gb:

    设置全局max_allowed_packet=268435456;

对于某些情况,您可能还需要增加以下值:

set global wait_timeout = 600;
set innodb_log_file_size =268435456;

如果你使用xampp服务器:

打开xampp -> mysql -> bin -> my.ini

参数如下:

max_allowed_packet = 500M

innodb_log_file_size = 128M

这对我帮助很大:)

以防这能帮助到任何人:

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

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

我在docker在docker-compose.yml中添加以下设置时遇到了同样的问题:

db:
image: mysql:8.0
command: --wait_timeout=800 --max_allowed_packet=256M --character-set-server=utf8 --collation-server=utf8_general_ci --default-authentication-plugin=mysql_native_password
volumes:
- ./docker/mysql/data:/var/lib/mysql
- ./docker/mysql/dump:/docker-entrypoint-initdb.d
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}

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

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

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

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


我对这个问题的看法是:

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

对我来说,它有助于修复一个innodb表的损坏的索引树。我用这个命令本地化了这样一个表

mysqlcheck -uroot --databases databaseName

结果

mysqlcheck: Got error: 2013: Lost connection to MySQL server during query when executing 'CHECK TABLE ...

如下所示,我只能从mysqld日志/var/log/mysqld.log中看到哪个表造成了问题。

FIL_PAGE_PREV links 2021-08-25T14:05:22.182328Z 2 [ERROR] InnoDB: Corruption of an index tree: table `database`.`tableName` index `PRIMARY`, father ptr page no 1592, child page no 1234'
mysqlcheck命令没有修复它,但有助于揭示它。 最终,我修复了它,从mysql cli

一个常规的mysql命令
OPTIMIZE table theCorruptedTableNameMentionedAboveInTheMysqld.log

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