首页 文章

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

提问于
浏览
258

当我尝试获取大型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

18 回答

  • 0

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

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

    $ mysql db_name <source.sql

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

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

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

    在Windows上,此文件位于:“C:\ ProgramData \ MySQL \ MySQL Server 5.6”在Linux(Ubuntu)上:/ etc / mysql

  • 6

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

    SET GLOBAL max_allowed_packet=1073741824;
    

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

  • 118

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

    mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql
    
  • 54

    一般来说错误:

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

    意思是 the client couldn't send a question to the server .


    mysql导入

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

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

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

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

    99 Increase max_allowed_packet and wait_timeout 在您的服务器配置中(例如 ~/.my.cnf ) .

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

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


    常见原因

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

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

    解决方案: Increase max_allowed_packet variable .

    • 确保变量位于 [mysqld] 部分,而不是 [mysql] .

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

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

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

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

    解决方案: Increase wait_timeout variable .

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

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

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

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

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

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

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

    • 还有更多,请了解更多信息:B.5.2.9 MySQL server has gone away .


    调试

    以下是一些专家级调试思路:

    • 检查日志,例如
    sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
    
    • 通过 mysqltelnet 或ping函数测试连接(例如PHP中的mysql_ping) .

    • 使用 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
    

    见:Getting started with DTracing MySQL

    了解更多如何在以下位置调试MySQL服务器或客户端:26.5 Debugging and Porting 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;
    }
    
  • 12

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

    $> mysqladmin variables -u user -p
    

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

    mysql> SET GLOBAL max_allowed_packet=1072731894
    

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

  • 11

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

    • 像其他人推荐的那样创建了/etc/my.cnf,其内容如下:
    [mysql]
    connect_timeout = 43200
    max_allowed_packet = 2048M
    net_buffer_length = 512M
    debug-info = TRUE
    
    • 将标志 --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分发5.5.51 for osx10.8(i386)

  • -3

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

    添加一行

    max_allowed_packet=500M
    

    完成后立即重启MySQL服务 .

  • 0

    您也可以以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';
    

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

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

  • 8

    解决方案是在 [mysqld] 标记下的选项文件中为 wait_timeoutconnect_timeout 参数增加值 .

    我不得不恢复一个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
    
  • 17

    如果你在Mac上并像我一样通过brew安装mysql,以下工作 .

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

    资料来源:For homebrew mysql installs, where's my.cnf?

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

    • mysql.server restart

  • -1
  • 3

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

    ndb_mgm -e 'ALL REPORT MEMORYUSAGE'
    

    并且mysqld也能正常工作 . 首先,我无法理解什么是错的 . 大约5分钟后,ndb_mgm结果显示没有数据节点正常工作 . 然后我意识到了这个问题 . 因此,尝试重新启动所有数据节点,然后mysql服务器又回来了,一切正常 .

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

  • 477

    如果它重新连接并获得连接ID 2,则服务器几乎肯定会崩溃 .

    联系服务器管理员并让他们诊断问题 . 没有非恶意SQL会导致服务器崩溃,mysqldump的输出肯定不应该 .

    可能的情况是,服务器管理员发生了一些大的操作错误,例如分配大于体系结构的地址空间限制的缓冲区大小,或者超过虚拟内存容量 . MySQL错误日志可能会有一些相关信息;如果他们有能力,他们会监控这个 .

  • 31

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

  • 0

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

  • 2

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

    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
    

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

    然后你只备份数据,并做同样的事情,它会工作 .

  • 11

    如何使用这样的mysql客户端:

    mysql -h <hostname> -u username -p <databasename> < file.sql
    

相关问题