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

时间:2012-05-06 22:46:13

标签: 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 ***

表格中没有任何内容更新。我已经尝试删除和取消删除表/数据库,以及重新启动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

22 个答案:

答案 0 :(得分:509)

max_allowed_packet=64M

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

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

  

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

     

在Linux(Ubuntu)上:/ etc / mysql

答案 1 :(得分:131)

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

SET GLOBAL max_allowed_packet=1073741824;

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

答案 2 :(得分:57)

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

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

答案 3 :(得分:33)

一般来说错误:

  

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

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

mysql import

在通过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'"
      
  • 您从客户端的TCP / IP连接获得超时。

    解决方案:增加wait_timeout变量

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

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

  • 主机名称查找失败(例如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

了解更多如何在26.5 Debugging and Porting MySQL调试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;
}

答案 4 :(得分:18)

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

$> mysqladmin variables -u user -p 

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

mysql> SET GLOBAL max_allowed_packet=1072731894

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

答案 5 :(得分:14)

我解决了错误ERROR 2006 (HY000) at line 97: MySQL server has gone away,并按顺序执行以下两个步骤成功迁移了&gt; 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)。

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

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

答案 6 :(得分:11)

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

添加一行

max_allowed_packet=500M

现在完成后重启MySQL服务。

答案 7 :(得分:11)

您也可以以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 :(得分:8)

解决方案是在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
  

块引用

答案 9 :(得分:6)

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

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

$ mysql db_name&lt; source.sql

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

答案 10 :(得分:5)

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

  1. cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf
  2. 来源:For homebrew mysql installs, where's my.cnf?

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

    2. mysql.server restart

答案 11 :(得分:2)

我在使用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)这样的返回信息,但没有表信息是显示。

答案 12 :(得分:2)

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

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)

答案 13 :(得分:0)

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

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

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

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

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

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

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

答案 17 :(得分:0)

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

我最终使用了-h 127.0.0.1而不是默认的var/run/mysqld/mysqld.sock

答案 18 :(得分:0)

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

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

注意:我很惊讶这个简单的解决方案在这个线程上讨论了 8 年多之后没有被提及......有时我们开发人员往往会想得太多。

答案 19 :(得分:0)

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

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

ma​​x_allowed_pa​​cket=500M

最后重启 MySQL 服务一次就大功告成了。

Metode-02:

如果您使用 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 查询。希望它会起作用。

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

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

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

答案 21 :(得分:-3)

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

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