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

时间:2011-10-29 22:44:10

标签: mysql mysql-error-2006

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

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

2006, MySQL server has gone away

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

30 个答案:

答案 0 :(得分:323)

我已经多次遇到这种情况,我通常认为答案是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。

答案 1 :(得分:38)

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

添加一行

  

max_allowed_pa​​cket的= 500M

完成后,

现在restart the MySQL service

答案 2 :(得分:30)

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

有关相关信息,请参阅PHP:mysqli_ping

答案 3 :(得分:30)

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

set global max_allowed_packet=268435456;

答案 4 :(得分:15)

错误: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是您认为查询可以花费的最长时间的秒数。

Further information on how to deal with Mysql connection issues.

编辑:您可能还想使用的其他两项设置是net_write_timeoutnet_read_timeout

答案 5 :(得分:15)

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

--max_allowed_packet=268435456

...\MAMP\bin\startMysql.sh

积分和更多详情here

答案 6 :(得分:10)

由于wait_timeout过期而发生此错误。

只需转到mysql服务器检查其wait_timeout:

  

的MySQL>显示变量类似于等待时间'

     

的MySQL>设置全局wait_timeout = 600#10分钟或最长等待时间   出你需要

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

答案 7 :(得分:9)

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

我尝试更改max_allowed_pa​​cket和wait_timeout设置,但都没有修复它。

事实证明我的服务器没有内存。我添加了1GB swap file,这解决了我的问题。

使用free -h检查您的记忆,看看它是否是导致记忆的原因。

答案 8 :(得分:8)

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

max_allowed_packet=8M

再次在php.ini(xampp / php / php.ini)上更改upload_max_filesize的选择大小。 e.g

upload_max_filesize=8M

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

答案 9 :(得分:6)

这对我来说是RAM问题。

即使在具有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

答案 10 :(得分:4)

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

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

答案 11 :(得分:4)

在我的情况下,它是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

答案 12 :(得分:4)

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

我建议这些值:

wait_timeout = 28800

max_allowed_pa​​cket = 8M

答案 13 :(得分:4)

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

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

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

答案 14 :(得分:4)

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

希望这有助于其他Wampserver用户。

答案 15 :(得分:3)

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

  1. 的config.inc.php
  2. config.sample.inc.php
  3. 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'。
    3. 最后一集:

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

      然后重启Wampserver。

      更改phpmyadmin用户名和密码

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

      这两行

      $cfg['Servers'][$i]['user'] = 'root';
      $cfg['Servers'][$i]['password'] = '';
      

      您可以在此处提供新的用户名和密码。 更改后保存文件并重新启动WAMP服务器。

答案 16 :(得分:3)

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

它会告诉你。

答案 17 :(得分:3)

取消注释my.ini/my.cnf下方的ligne,这会将您的大文件拆分为较小的部分

# binary logging format - mixed recommended
# binlog_format=mixed

TO

# binary logging format - mixed recommended
binlog_format=mixed

答案 18 :(得分:2)

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

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

增加数据包大小。

max_allowed_packet = 2M -> 10M

答案 19 :(得分:2)

我在Ubuntu桌面上的不同MySQL客户端软件中收到了错误2006消息。事实证明我的JDBC驱动程序版本太旧了。

答案 20 :(得分:2)

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

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

更改以下参数:

max_allowed_pa​​cket = 500M

innodb_log_file_size = 128M

这对我很有帮助:)

答案 21 :(得分:1)

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

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

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

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


我对这个问题的总结:

  • 始终备份您的数据库。手动或通过 CRON 作业
  • 我注意到受影响的行中有特殊字符。所以当我恢复表时,我立即将这个表的排序规则从 latin1_swedish_ci 更改为 utf8_general_ci
  • 我的数据库运行良好,然后我的系统突然遇到了这个问题。也许这也与我们的托管服务提供商升级 MySQL 数据库有关。所以经常备份是必须的!

答案 22 :(得分:0)

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

答案 23 :(得分: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。

答案 24 :(得分:0)

此错误有多种原因。

与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
  • 查看有关RAM的信息

与框架有关:

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

如何调试:

  • 检查MySQL / MariaDB变量的值。
    • 使用sql:SHOW VARIABLES LIKE '%time%';
    • 命令行:mysqladmin variables
  • 打开冗长的错误提示:
    • MariaDB:log_warnings = 4
    • MySQL:log_error_verbosity = 3
  • 选中docs for more info about the error

答案 25 :(得分:0)

如果使用XAMPP,则有一种更简单的方法。 打开XAMPP控制面板,然后单击mysql部分中的config按钮。
enter image description here

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

enter image description here

然后重新启动mysql服务。单击停止在Mysql服务上,再次单击开始。等待几分钟。 enter image description here enter image description here

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

答案 26 :(得分:0)

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;

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

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

并且由于机器的硬件和设置允许,我们通过添加

来增加服务器上允许的连接数
max_connections = 500

到我们的配置文件。到目前为止,这已解决了我们的问题,并且我们了解了有关终止mysql连接的知识。

答案 28 :(得分:0)

我在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}

答案 29 :(得分:-5)

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