349

当我尝试获取大型 SQL 文件(大型INSERT查询)时出现此错误。

mysql>  source file.sql
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2
Current database: *** NONE ***

ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3
Current database: *** NONE ***

表中的任何内容都没有更新。我试过删除和取消删除表/数据库,以及重新启动 MySQL。这些都不能解决问题。

这是我的最大数据包大小:

+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+

这是文件大小:

$ ls -s file.sql 
79512 file.sql

当我尝试其他方法时...

$ ./mysql -u root -p my_db < file.sql
Enter password: 
ERROR 2006 (HY000) at line 1: MySQL server has gone away
4

24 回答 24

637
max_allowed_packet=64M

将此行添加到my.cnf文件中解决了我的问题。

当列的值很大时,这很有用,这会导致问题,您可以在此处找到解释。

在 Windows 上,此文件位于:“C:\ProgramData\MySQL\MySQL Server 5.6”

在 Linux (Ubuntu) 上:/etc/mysql

于 2012-10-09T04:48:37.440 回答
181

您可以增加最大允许数据包

SET GLOBAL max_allowed_packet=1073741824;

http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_pa​​cket

于 2013-09-24T10:59:08.200 回答
71

由于某种原因,全局更新和 my.cnf 设置对我不起作用。max_allowed_packet将值直接传递给客户端在这里工作:

mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql
于 2013-12-19T22:14:23.623 回答
41

一般来说,错误:

错误:2006 ( CR_SERVER_GONE_ERROR) - MySQL 服务器已消失

意味着客户端无法向服务器发送问题


mysql进口

在您通过 导入数据库文件的特定情况下mysql,这很可能意味着 SQL 文件中的某些查询太大而无法导入,它们无法在服务器上执行,因此客户端在第一次发生错误时失败。

所以你有以下可能性:

  • 添加强制选项 ( -f)mysql以继续并执行其余查询。

    如果数据库有一些与缓存无关的大型查询,这很有用。

  • max_allowed_packetwait_timeout在您的服务器配置中增加~/.my.cnf(例如)。

  • 使用选项转储数据库--skip-extended-insert以分解大型查询。然后再次导入。

  • 尝试--max-allowed-packetmysql.


常见原因

通常,此错误可能意味着几件事,例如:

  • 对服务器的查询不正确或太大,

    解决方案:增加max_allowed_packet变量

    • 确保变量在[mysqld]section 下,而不是[mysql].

    • 不要害怕使用大量数字进行测试(例如1G)。

    • 不要忘记重新启动 MySQL/MariaDB 服务器。

    • 仔细检查该值是否通过以下方式正确设置:

      mysql -sve "SELECT @@max_allowed_packet" # or:
      mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
      
  • 您从客户端的 TCP/IP 连接超时。

    解决方案:增加wait_timeout变量

  • 您尝试在关闭与服务器的连接后运行查询。

    解决方案:应更正应用程序中的逻辑错误。

  • 主机名查找失败(例如 DNS 服务器问题),或服务器已使用--skip-networking选项启动。

    另一种可能性是您的防火墙阻止了 MySQL 端口(例如,默认情况下为 3306)。

  • 正在运行的线程已被杀死,因此请重试。

  • 您遇到了服务器在执行查询时死机的错误。

  • 在不同主机上运行的客户端没有必要的连接权限。

  • 还有更多,请在以下位置了解更多信息:B.5.2.9 MySQL 服务器已消失


调试

以下是一些专家级的调试想法:

  • 检查日志,例如

    sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
    
  • mysql通过或telnetping 函数(例如mysql_ping在 PHP 中)测试您的连接。

  • 用于tcpdump嗅探 MySQL 通信(不适用于套接字连接),例如:

    sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
    
  • 在 Linux 上,使用strace. 在 BSD/Mac 上使用dtrace/ dtruss,例如

    sudo dtruss -a -fn mysqld 2>&1
    

    请参阅:DTracing MySQL 入门

了解更多如何调试 MySQL 服务器或客户端:26.5 调试和移植 MySQL

作为参考,请检查sql-common/client.c文件中负责为CR_SERVER_GONE_ERROR客户端命令引发错误的源代码。

MYSQL_TRACE(SEND_COMMAND, mysql, (command, header_length, arg_length, header, arg));
if (net_write_command(net,(uchar) command, header, header_length,
          arg, arg_length))
{
  set_mysql_error(mysql, CR_SERVER_GONE_ERROR, unknown_sqlstate);
  goto end;
}
于 2016-06-07T14:32:38.170 回答
25

ERROR 2006 (HY000) at line 97: MySQL server has gone away我通过按顺序执行以下两个步骤解决了错误并成功迁移了 >5GB 的 sql 文件:

  1. 按照其他人的建议创建 /etc/my.cnf ,内容如下:

    [mysql]
    connect_timeout = 43200
    max_allowed_packet = 2048M
    net_buffer_length = 512M
    debug-info = TRUE
    
  2. 将标志附加--force --wait --reconnect到命令(即mysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnect)。

重要说明:必须执行这两个步骤,因为如果我不费心对 /etc/my.cnf 文件进行更改以及附加这些标志,则导入后会丢失一些表。

使用的系统:OSX El Capitan 10.11.5;mysql Ver 14.14 Distrib 5.5.51 for osx10.8 (i386)

于 2016-09-02T02:46:32.037 回答
21

以防万一,要检查您可以使用的变量

$> mysqladmin variables -u user -p 

这将显示当前变量,在本例中为 max_allowed_pa​​cket,正如有人在另一个答案中所说,您可以使用临时设置它

mysql> SET GLOBAL max_allowed_packet=1072731894

在我的情况下,cnf 文件没有被考虑在内,我不知道为什么,所以 SET GLOBAL 代码真的很有帮助。

于 2014-08-03T03:53:43.443 回答
13

您也可以以 root(或 SUPER 权限)身份登录数据库并执行

set global max_allowed_packet=64*1024*1024;

也不需要重启 MySQL。请注意,您应该my.cnf按照其他解决方案中的说明修复文件:

[mysqld]
max_allowed_packet=64M

并在重启 MySQL 后确认更改:

show variables like 'max_allowed_packet';

您也可以使用命令行,但这可能需要更新启动/停止脚本,这些脚本可能无法在系统更新和补丁程序中继续存在。

根据要求,我在这里添加我自己的答案。很高兴看到它有效!

于 2016-05-27T12:44:37.980 回答
12

解决方案是在标签下增加选项文件中给定的值wait_timeout和参数。connect_timeout[mysqld]

我必须恢复一个 400MB 的 mysql 备份,这对我有用(我在下面使用的值有点夸张,但你明白了):

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE
connect_timeout = 1000000
net_write_timeout = 1000000
wait_timeout = 1000000
max_allowed_packet = 1024M
interactive_timeout = 1000000
net_buffer_length = 200M
net_read_timeout = 1000000
set GLOBAL delayed_insert_timeout=100000

块引用

于 2015-10-25T21:39:44.850 回答
10

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

添加一行

max_allowed_packet=500M

完成后,现在重新启动 MySQL 服务。

于 2013-10-18T14:15:47.373 回答
6

这里可能会发生几件事;

  • INSERT的运行时间很长,客户端正在断开连接。当它重新连接时,它没有选择数据库,因此出现错误。这里的一种选择是从命令行运行批处理文件,并在参数中选择数据库,如下所示;

$ mysql db_name < source.sql

  • 另一种是通过php或其他语言运行您的命令。在每个长时间运行的语句之后,您可以关闭并重新打开连接,以确保您在每个查询开始时都已连接。
于 2012-05-06T23:13:22.313 回答
5

如果您在 Mac 上并像我一样通过 brew 安装了 mysql,则以下操作有效。

  1. cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf

资料来源:对于自制 mysql 安装,my.cnf 在哪里?

  1. 添加max_allowed_packet=1073741824/usr/local/etc/my.cnf

  2. mysql.server restart

于 2016-04-05T06:12:25.110 回答
2

我在使用Mysql Cluster时遇到了这个错误,我不知道这个问题是不是来自集群使用。由于错误完全相同,所以在这里给出我的解决方案。收到此错误是因为数据节点突然崩溃。但是当节点崩溃时,你仍然可以使用 cmd 得到正确的结果:

ndb_mgm -e 'ALL REPORT MEMORYUSAGE'

而且 mysqld 也可以正常工作。所以起初,我不明白出了什么问题。大约 5 分钟后,ndb_mgm 结果显示没有数据节点工作。然后我意识到了问题。因此,尝试重新启动所有数据节点,然后 mysql 服务器又回来了,一切正常。

但是有一点对我来说很奇怪,在我丢失 mysql 服务器进行一些查询后,当我使用 cmd like 时show tables,我仍然可以获得 like 的返回信息33 rows in set (5.57 sec),但没有显示表信息。

于 2013-01-29T11:07:56.860 回答
2

当您使用与转储中使用的不同的 COLLATION 创建 SCHEMA 时,也会出现此错误消息。所以,如果转储包含

CREATE TABLE `mytab` (
..
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

您还应该在 SCHEMA 排序规则中反映这一点:

CREATE SCHEMA myschema COLLATE utf8_unicode_ci;

我一直在架构中使用 utf8mb4_general_ci,因为我的脚本来自全新的 V8 安装,现在在旧 5.7 上加载数据库崩溃了,让我几乎发疯。

所以,也许这可以帮助你节省一些令人沮丧的时间...... :-)

(MacOS 10.3,mysql 5.7)

于 2020-02-19T10:19:12.113 回答
2

我在 XAMMP 中遇到了同样的问题

Metode-01:我在文件中更改了 max_allowed_paD:\xampp\mysql\bin\my.ini,如下所示:

max_allowed_pa​​cket=500M

最后重新启动一次 MySQL 服务就完成了。

方法02:

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

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

在此处输入图像描述

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

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

于 2021-07-06T12:42:04.047 回答
1

如果它正在重新连接并获得连接 ID 2,则服务器几乎肯定刚刚崩溃。

联系服务器管理员并让他们诊断问题。任何非恶意 SQL 都不应该使服务器崩溃,mysqldump 的输出当然也不应该。

可能是服务器管理员犯了一些重大的操作错误,例如分配的缓冲区大小大于体系结构的地址空间限制,或者大于虚拟内存容量。MySQL 错误日志可能会有一些相关信息;如果他们有能力,他们将对此进行监控。

于 2012-05-07T01:37:05.297 回答
1

这是一个更罕见的问题,但如果有人复制了整个 /var/lib/mysql 目录作为将他们的数据库迁移到另一台服务器的一种方式,我已经看到了这一点。它不起作用的原因是数据库正在运行并使用日志文件。如果 /var/log/mysql 中有日志,有时它不起作用。解决方案是也复制 /var/log/mysql 文件。

于 2017-01-16T20:46:38.693 回答
1

对于 amazon RDS(这是我的情况),您可以将max_allowed_packet参数值更改为以字节为单位的任何数值,这对于您可能拥有的任何插入中的最大数据有意义(例如:如果您的插入中有一些 50mb 的 blob 值,请设置max_allowed_packet到 64M = 67108864),在新的或现有的parameter-group. 然后将该参数组应用于您的 MySQL 实例(可能需要重新启动实例)。

于 2018-01-26T15:17:43.173 回答
0

对于寻找数据库导入失败解决方案的 Drupal 8 用户:

在 sql 转储文件的末尾,可以命令将数据插入“webprofiler”表。那是我猜一些调试日志文件,对于站点工作并不重要,因此可以删除所有这些。我删除了所有这些插入,包括 LOCK TABLES 和 UNLOCK TABLES(以及介于两者之间的所有内容)。它位于 sql 文件的最底部。此处描述了问题:

https://www.drupal.org/project/devel/issues/2723437

但是除了截断该表之外,没有其他解决方案。

顺便说一句,我尝试了上面答案中的所有解决方案,但没有其他帮助。

于 2019-09-27T12:42:30.270 回答
0

我已经尝试了以上所有解决方案,都失败了。

我最终使用-h 127.0.0.1而不是使用 default var/run/mysqld/mysqld.sock

于 2019-11-27T10:17:32.997 回答
0

如果您尝试过所有这些解决方案,尤其是。增加到max_allowed_packet支持的最大数量1GB并且您仍然看到这些错误,这可能是您的服务器实际上没有足够的可用 RAM 内存...

解决方案 = 将您的服务器升级到更多 RAM 内存,然后重试。

注意:我很惊讶这个简单的解决方案在这个线程讨论了 8 年多之后没有被提及......有时我们开发人员倾向于过度思考事情。

于 2021-01-07T00:01:27.133 回答
0

添加max_allowed_packet=64M[mysqld]

[mysqld] 
max_allowed_packet=64M

重新启动 MySQL 服务器。

于 2021-12-03T08:11:34.120 回答
0

消除触发警告的错误是我的最终解决方案。我还更改了 max_allowed_pa​​cket,它有助于处理有错误的较小文件。消除错误也令人难以置信地加快了进程。

于 2021-12-06T13:17:10.633 回答
-1

如果这些答案都不能解决您的问题,我通过删除表并以这种方式自动重新创建它们来解决它:

when creating the backup, first backup structure and be sure of add:
DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT
CREATE PROCEDURE / FUNCTION / EVENT
IF NOT EXISTS
AUTO_INCREMENT

然后只需将此备份与您的数据库一起使用,它将删除并重新创建您需要的表。

然后你只备份数据,做同样的事情,它会起作用。

于 2013-11-08T10:15:28.483 回答
-3

像这样使用mysql客户端怎么样:

mysql -h <hostname> -u username -p <databasename> < file.sql
于 2012-05-06T23:11:42.187 回答