MySQL错误2006:mysql服务器已消失


238

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

文件处理需要一些时间,并且过程中途终止,并出现以下错误:

2006, MySQL server has gone away

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


2
它取决于该女巫服务器给出的错误
bksi 2011年


11
对于从Google到这里的人们:如果更改max_allowed_packet大小或wait_timeout金额不能解决问题,请检查您的内存使用情况。我遇到了同样的错误,这是由于我的服务器内存不足而引起的。我添加了一个1GB的交换文件,并对其进行了修复。
Pikamander2 '16

2
@ Pikamander2感谢您的提示!
ihsan

4
哦! 那都是谎言吗?MySQL服务器实际上没有去任何地方?它仍然在我的服务器上吗?hao!:))
Damilola Olowookere'Aug

Answers:



359

我已经遇到过很多次了,通常我发现答案是的非常低的默认设置max_allowed_packet

通常将其提高/etc/my.cnf(低于[mysqld])至8或16M。(MySql 5.7中的默认值为4194304值为4MB。)

[mysqld]
max_allowed_packet=16M

注意:仅创建该行(如果该行不存在)

注意:可以在服务器运行时对其进行设置。

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


28
请注意,可以在服务器运行时对其进行设置。使用:“设置全局max_allowed_pa​​cket = 104857600”。注意:我的值将其设置为100MB。
rickumali 2012年

26
对于xampp用户,可以在以下位置找到my.cnf:C:\ xampp \ mysql \ bin \
Valentin Despa 2012年

3
在WAMP上:C:\ wamp \ bin \ mysql \ mysql5.6.12 \ my.ini,在[wampmysqld]下设置max_allowed_pa​​cket = 500M
Elia Weiss

2
修正了我的问题:)
Altaf Hussain,

2
重要说明:我必须重新启动mysql服务器才能使此效果生效。即mysql.server stopmysql.server start(2018年10月,MySQL的V5.7,MacOS的)
尼丁纳因

41

我有同样的问题,但是max_allowed_packet在下面的my.ini/my.cnf文件中进行了更改[mysqld]就可以了。

加一行

max_allowed_pa​​cket = 500M

现在restart the MySQL service一旦完成。


5
另一个人写了16M,你写了500M,这个设置的意义是什么?
pal4life 2014年

1
@ pal4life是允许的插入语句的最大大小。如果您的insert语句超过16M,该怎么办(如果该语句包含longblob列左右),如果要插入大量数据,则为了安全起见,使其变得像500M一样大。
Sathish D

这对我有用,但我不知道为什么。默认值为1M,但是当我将其更改为100M时,错误消失了。当我设置wait_timeout = 30试图减少服务器上的空闲线程数时,问题开始了。
文森特

36

我在MySQL命令行中使用以下命令来还原大小超过7GB的MySQL数据库,并且它可以正常工作。

set global max_allowed_packet=268435456;

不知道为什么这被否决了?该错误与数据包大小有关很有道理...
FlorinelChis

这解决了我的问题,与问题没有直接关系,但应该帮助遇到其他问题的人。
Migerusantte

要检查是否已更改或查看当前值,可以使用show variables like 'max_allowed_packet';
Marcin 19'1

16

错误: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




11

此错误有多种原因。

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

服务器相关:

  • 您的服务器内存已满-使用以下命令检查有关RAM的信息 free -h

框架相关:

  • 检查框架的设置。以Django为例使用CONN_MAX_AGE(请参阅docs

如何调试:

  • 检查MySQL / MariaDB变量的值。
    • 与SQL: SHOW VARIABLES LIKE '%time%';
    • 命令行: mysqladmin variables
  • 为错误启用详细信息:
    • MariaDB: log_warnings = 4
    • MySQL: log_error_verbosity = 3
  • 检查文档以获取有关该错误的更多信息

9

在Windows上,那些使用xampp的人应该使用此路径xampp / mysql / bin / my.ini并将max_allowed_pa​​cket(在[mysqld]部分下)更改为您选择的大小。例如

max_allowed_packet=8M

再次在php.ini(xampp / php / php.ini)上更改upload_max_filesize选择大小。例如

upload_max_filesize=8M

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


这应该是选择的答案
sanchy

我找不到upload_max_filesize变量。在我的mysql中,它总是无法识别
Aminah Nuraini

9

我在DigitalOcean Ubuntu服务器上遇到了同样的错误。

我尝试更改max_allowed_pa​​cket和wait_timeout设置,但它们均未修复。

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

检查您的记忆,free -h看是否是引起它的原因。


1
非常感谢!我在DigitalOcean上遇到了同样的问题,并且此解决方案有效!我运行了脚本的许多实例,但经过一些线程后,它突然停止并杀死了所有现有连接。现在一切都很好。
Stalinko

7

对我来说这是RAM问题。

即使在具有12个CPU内核和32 GB RAM的服务器上,我也遇到相同的问题。我进行了更多研究,并尝试释放RAM。这是我在Ubuntu 14.04上释放内存的命令:

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

而且,它修复了所有问题。我已将其设置为每天运行一次。

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

5

就我而言,这是 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

5

如果您使用的是64位WAMPSERVER,请搜索多次出现的max_allowed_pa​​cket,因为WAMP使用在[wampmysqld64]下设置的值,而不是在[mysqldump]下设置的值,这对我来说是个问题,我正在更新错误的值。将其设置为max_allowed_pa​​cket = 64M之类的东西。

希望这可以帮助其他的Wampserver用户。


5

通常,这表明MySQL服务器连接问题或超时。一般可以通过改变来解决WAIT_TIMEOUTmax_allowed_pa​​cket的my.cnf中或类似。

我建议这些值:

wait_timeout = 28800

max_allowed_pa​​cket = 8M


4

对于“流浪者盒子”,请确保为盒子分配了足够的内存

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

1
谢谢你:)
SynackSA '16

4

不太可能出现的情况是,客户端和服务器之间有防火墙,迫使TCP重置为连接。

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

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


4

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

它会告诉你。


4

如果您使用的是xampp服务器:

转到xampp-> mysql-> bin-> my.ini

更改以下参数:

max_allowed_pa​​cket = 500M

innodb_log_file_size = 128M

这对我帮助很大:)


3

取消注释下面的ligne my.ini/my.cnf,这会将大文件分成较小的部分

# binary logging format - mixed recommended
# binlog_format=mixed

# binary logging format - mixed recommended
binlog_format=mixed

3

我发现了“#2006-MySQL服务器已消失”此错误的解决方案。解决方法是只需要检查两个文件

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

这些文件在Windows中的路径是

C:\wamp64\apps\phpmyadmin4.6.4

在这两个文件中,此值:

$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服务器。


2

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


2

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

如果您使用的是xampp。转到xampp控制面板->单击MySql配置->打开my.ini。

增加数据包大小。

max_allowed_packet = 2M -> 10M

2

如果您使用的是XAMPP,则有一种更简单的方法。打开XAMPP控制面板,然后单击mysql部分中的config按钮。
在此处输入图片说明

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

在此处输入图片说明

然后重启mysql服务。单击停止在Mysql服务上,再次单击开始。等待几分钟。 在此处输入图片说明 在此处输入图片说明

然后尝试再次运行您的Mysql查询。希望它能工作。


2

MAMP 5.3,您将找不到my.cnf并添加它们不起作用,因为max_allowed_pa​​cket存储在变量中。

一种解决方案可以是:

  1. 转到http:// localhost / phpmyadmin
  2. 转到“ SQL”选项卡
  3. 运行SHOW VARIABLES并检查值,如果它很小,则使用大值运行
  4. 运行以下查询,将max_allowed_pa​​cket设置为7gb:

    设置全局max_allowed_pa​​cket = 268435456;

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

set global wait_timeout = 600;
set innodb_log_file_size =268435456;

0

对于使用XAMPP的用户,C:\ xampp \ mysql \ bin \ my.ini中有2个max_allowed_pa​​cket参数。


0

发生此错误的原因主要有两个。

  1. 您的RAM太低。
  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。


0

以防万一这可以帮助任何人:

当我在应用程序的多个部分中调用的函数中打开和关闭连接时,出现此错误。我们有太多的连接,因此我们认为最好重用现有的连接或将其丢弃并创建一个新的连接,如下所示:

  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; 返回self :: newConnection($ database,$ host,$ user,$ password); } return self :: $ instance; }事实证明,我们对终止的处理过于彻底,因此在旧连接上执行重要操作的流程永远无法完成其业务。所以我们删除了这些行

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

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

max_connections = 500

到我们的配置文件。这现在解决了我们的问题,我们了解了有关终止mysql连接的知识。


-5

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


2
这实际上是一个可行的答案,因为MySQL会在八个小时后关闭空闲连接。
Bojan Hrnkas '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.