ERROR 2006(HY000):MySQL服务器已经消失

bgc*_*ode 290 mysql

当我尝试获取大型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 ***
Run Code Online (Sandbox Code Playgroud)

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

这是我的最大包大小:

+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
Run Code Online (Sandbox Code Playgroud)

这是文件大小:

$ ls -s file.sql 
79512 file.sql
Run Code Online (Sandbox Code Playgroud)

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

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

Kur*_*ong 529

max_allowed_packet=64M
Run Code Online (Sandbox Code Playgroud)

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

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

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

在Linux(Ubuntu)上:/ etc/mysql

  • 您也可以以root身份(或SUPER权限)登录数据库并执行`set global max_allowed_pa​​cket = 64*1024*1024;` - 不需要重启MySQL (141认同)
  • 我不得不在[mysqld]下添加它以使其工作. (16认同)
  • 您应该可以将它放在命令行上,这将避免临时编辑系统文件:<code> mysql --max_allowed_pa​​cket = 1GM </ code> (6认同)
  • 对于任何寻找my.cnf文件位置的人,您可以查看[此答案](http://stackoverflow.com/a/2485758/855838).另外不要忘记通过键入以下命令重新启动mysql:`sudo service mysql restart`,以使my.cnf文件的更改生效. (5认同)
  • 这个解决方案解决了我所说的问题; 没有什么可以通过客户端配置/选项完成,我不愿意通过PHP或其他方式下去程序化解决方案. (3认同)
  • 这为我修好了.my.cnf可以位于/ etc文件夹中. (3认同)

Nan*_*mar 140

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

SET GLOBAL max_allowed_packet=1073741824;
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我有用,而接受的答案却没有.我猜这个答案的更高价值是我的解决方案的根源. (3认同)

Mar*_*hev 61

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

mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql
Run Code Online (Sandbox Code Playgroud)

  • 根据MySQL网站,应该使用标记答案和这个. (4认同)
  • 请记住,使用 `--max_allowed_pa​​cket` 只会影响客户端。考虑通过编辑 `/etc/my.cnf` 文件中的 `max_allowed_pa​​cket` 并重新启动你的 mysql 服务器来修改 mysql 服务器(mysqld)。 (3认同)
  • 更改这些设置后,请不要忘记重新加载配置文件或重新启动服务器 (2认同)

ken*_*orb 33

一般来说错误:

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

表示客户端无法向服务器发送问题.


mysql 进口

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

所以你有以下几种可能性:

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

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

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

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

  • 尝试应用--max-allowed-packet选项mysql.


常见原因

一般来说,这个错误可能意味着几件事,例如:

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

    解决方案:增加max_allowed_packet变量.

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

    • 不要害怕使用大数字进行测试(比如1G).

    • 不要忘记重启MySQL/MariaDB服务器.

    • 仔细检查值是否正确设置:

      mysql -sve "SELECT @@max_allowed_packet" # or:
      mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
      
      Run Code Online (Sandbox Code Playgroud)
  • 您从客户端的TCP/IP连接获得超时.

    解决方案:增加wait_timeout变量.

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

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

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

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

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

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

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

  • 还有更多,所以在以下方面了解更多:B.5.2.9 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;
}
Run Code Online (Sandbox Code Playgroud)

  • `--skip-extended-insert`为我工作. (2认同)

Zlo*_*niy 18

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

$> mysqladmin variables -u user -p 
Run Code Online (Sandbox Code Playgroud)

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

mysql> SET GLOBAL max_allowed_packet=1072731894
Run Code Online (Sandbox Code Playgroud)

在我的情况下,没有考虑cnf文件,我不知道为什么,所以SET GLOBAL代码确实有帮助.


Luk*_*oen 18

我通过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
    
    Run Code Online (Sandbox Code Playgroud)
  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 for osx10.8(i386)发布5.5.51

  • 即使按照所有说明操作,我仍然收到错误消息。 (2认同)
  • 仅供参考,“max_allowed_pa​​cket”不能超过“1GB”或“1024M”,并且在 MySQL 5.7+ 上,“net_buffer_length”根据数据包设置自动缩放(不要设置它)。最后,“connect_timeout”不应该与此错误相关,但其他超时设置可能与此错误相关,特别是“wait_timeout”和“interactive_timeout”...如果这些调整都不起作用,请尝试将服务器升级到更多 RAM 内存;) (2认同)

Sat*_*h D 11

我有同样的问题,但在[mysqld]下的my.ini/my.cnf文件中更改max_allowed_pa​​cket就成了伎俩.

添加一行

max_allowed_packet=500M
Run Code Online (Sandbox Code Playgroud)

完成后立即重启MySQL服务.


raz*_*zed 11

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

set global max_allowed_packet=64*1024*1024;
Run Code Online (Sandbox Code Playgroud)

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

[mysqld]
max_allowed_packet=64M
Run Code Online (Sandbox Code Playgroud)

并在重新启动MySQL后确认更改:

show variables like 'max_allowed_packet';
Run Code Online (Sandbox Code Playgroud)

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

根据要求,我在这里添加自己的答案.很高兴看到它的作品!


小智 9

解决方案是在标签下增加选项文件中的值wait_timeoutconnect_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
Run Code Online (Sandbox Code Playgroud)


Chr*_*nry 6

这里可能会发生一些事情;

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

$ mysql db_name <source.sql

  • 另一种是通过php或其他语言运行您的命令.在每个长时间运行的语句之后,您可以关闭并重新打开连接,确保在每个查询开始时连接.


Rah*_*hul 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