287

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

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

2006, MySQL server has gone away

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

4

31 回答 31

432

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

于 2012-02-28T09:48:07.677 回答
52

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

添加一行

max_allowed_pa​​cket=500M

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

于 2013-10-17T11:51:24.237 回答
44

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

set global max_allowed_packet=268435456;
于 2016-02-24T10:31:34.727 回答
36

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

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

于 2011-10-29T23:15:27.020 回答
19

Error: 2006 (CR_SERVER_GONE_ERROR)

Message: MySQL server has gone away

Generally you can retry connecting and then doing the query again to solve this problem - try like 3-4 times before completely giving up.

I'll assuming you are using PDO. If so then you would catch the PDO Exception, increment a counter and then try again if the counter is under a threshold.

If you have a query that is causing a timeout you can set this variable by executing:

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

Where 300 is the number of seconds you think the maximum time the query could take.

Further information on how to deal with Mysql connection issues.

EDIT: Two other settings you may want to also use is net_write_timeout and net_read_timeout.

于 2011-10-29T23:22:21.353 回答
17

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

--max_allowed_packet=268435456

...\MAMP\bin\startMysql.sh

学分和更多细节在这里

于 2012-02-29T17:00:35.540 回答
17

此错误有多种原因。

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(请参阅文档

如何调试它:

  • 检查 MySQL/MariaDB 变量的值。
    • 使用 sql:SHOW VARIABLES LIKE '%time%';
    • 命令行:mysqladmin variables
  • 打开错误的详细程度:
    • 玛丽亚数据库:log_warnings = 4
    • MySQL:log_error_verbosity = 3
  • 检查文档以获取有关错误的更多信息
于 2019-02-21T09:48:06.917 回答
12

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

只需去 mysql 服务器检查它的 wait_timeout :

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

mysql> set global wait_timeout = 600 # 10分钟或你需要的最大等待时间

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

于 2015-01-16T04:26:38.200 回答
12

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

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

更改以下参数:

max_allowed_pa​​cket = 500M

innodb_log_file_size = 128M

这对我帮助很大:)

于 2019-08-03T08:32:14.433 回答
11

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

max_allowed_packet=8M

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

upload_max_filesize=8M

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

于 2015-10-16T16:02:00.887 回答
11

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

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

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

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

于 2016-09-19T23:45:55.700 回答
9

这对我来说是 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
于 2017-03-26T05:38:58.833 回答
7

在我的情况下,它是变量的低值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
于 2016-09-08T14:31:12.153 回答
6

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

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

于 2018-03-14T14:54:04.347 回答
6

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

我会建议这些值:

等待超时 = 28800

max_allowed_pa​​cket = 8M

于 2018-06-29T14:35:33.610 回答
5

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

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

在此处输入图像描述

然后重启mysql服务。单击 Mysql 服务上的停止,再次单击启动。等待几分钟。 在此处输入图像描述 在此处输入图像描述

然后尝试再次运行您的 Mysql 查询。希望它会奏效。

于 2019-05-05T05:44:14.967 回答
5

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

它会告诉你。

于 2018-06-30T18:06:38.523 回答
5

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;
于 2019-05-09T20:47:48.180 回答
4

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

config.vm.provider "virtualbox" do |vb|
  vb.memory = "4096"
end
于 2015-12-13T08:39:28.497 回答
4

The unlikely scenario is you have a firewall between the client and the server that forces TCP reset into the connection.

I had that issue, and I found our corporate F5 firewall was configured to terminate inactive sessions that are idle for more than 5 mins.

Once again, this is the unlikely scenario.

于 2017-05-23T18:36:16.710 回答
4

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

如果您使用的是 xampp。进入xampp控制面板->点击MySql config->打开my.ini。

增加数据包大小。

max_allowed_packet = 2M -> 10M
于 2018-01-10T11:43:53.827 回答
3

我找到了“#2006 - MySQL server has gone away”这个错误的解决方案。解决方案是你只需要检查两个文件

  1. 配置文件
  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. 配置文件
  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 服务器。

于 2017-06-10T08:18:01.967 回答
3

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

# binary logging format - mixed recommended
# binlog_format=mixed

# binary logging format - mixed recommended
binlog_format=mixed
于 2015-09-25T14:30:17.580 回答
2

我在 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}
于 2020-11-11T17:14:47.493 回答
2

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

于 2017-06-16T15:58:16.557 回答
1

发生此错误基本上有两个原因。

  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()

无论其背后的原因是什么,它都会减轻错误,尤其是第二个原因。

如果是内存不足导致的,要么从代码、数据库配置上提高数据库连接效率,要么干脆提高内存。

于 2018-09-21T10:54:08.257 回答
1

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

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

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

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


我对这个问题的看法:

  • 始终备份您的数据库。手动或通过 CRON 作业
  • 我注意到受影响的行中有特殊字符。所以当我恢复表时,我立即将这张表的排序规则从更改latin1_swedish_ciutf8_general_ci
  • 我的数据库在此之前工作正常,但我的系统突然遇到了这个问题。也许这也与我们的托管服务提供商升级 MySQL 数据库有关。所以经常备份是必须的!
于 2021-05-03T01:49:52.460 回答
0

对我来说,它有助于修复一个 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
于 2021-08-25T16:04:31.317 回答
0

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

于 2018-06-26T12:10:14.240 回答
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;
      return self::newConnection($database, $host, $user, $password);
    }
      return self::$instance;
    }

事实证明,我们在杀戮方面有点过于彻底,因此在旧连接上执行重要操作的进程永远无法完成他们的业务。所以我们删除了这些行

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

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

max_connections = 500

到我们的配置文件。这暂时解决了我们的问题,我们学到了一些关于终止 mysql 连接的知识。

于 2020-05-20T07:10:26.920 回答
-7

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

于 2011-10-30T00:18:38.240 回答