错误2006(HY000):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 
 max_allowed_packet=64M 

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

当列的值很大时会很有用,这会导致问题,您可以在这里find解释。

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

在Linux(Ubuntu)上:/ etc / mysql

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

 SET GLOBAL max_allowed_packet=1073741824; 

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

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

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

一般的错误是:

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

意味着客户端不能发送问题到服务器


mysql导入

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

所以你有以下的可能性:

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

    如果数据库有一些与高速caching相关的大的查询,那么这是非常有用的。

  • 在服务器configuration中增加max_allowed_packetwait_timeout (例如~/.my.cnf )。

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

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


常见的原因

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

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

    解决scheme: 增加max_allowed_packetvariables

    • 确保variables在[mysqld]部分下,而不是[mysql]

    • 不要害怕使用大量的testing(如1G )。

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

    • 仔细检查值设置正确的:

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

    解决scheme: 增加wait_timeoutvariables

  • 在与服务器的连接closures后,您试图运行查询。

    解决scheme:应用程序中的逻辑错误应该得到纠正。

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

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

  • 正在运行的线程已被杀死,所以再次重试。

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

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

  • 还有更多,所以了解更多: B.5.2.9 MySQL服务器已经消失 。


debugging

这里有一些专家级的debugging思路:

  • 检查日志,例如

     sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error") 
  • 通过mysqltelnet或ping函数testing你的连接(例如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 

    请参阅: DTracing MySQL入门

了解更多如何debuggingMySQL服务器或客户端: 26.5debugging和移植MySQL 。


源代码

负责抛出CR_SERVER_GONE_ERROR错误的源代码( mysqlx.cc ):

 void Connection::throw_mysqlx_error(const boost::system::error_code &error) { if (!error) return; switch (error.value()) { // OSX return this undocumented error in case of kernel race-conndition // lets ignore it and next call to any io function should return correct // error case boost::system::errc::wrong_protocol_type: return; case boost::asio::error::eof: case boost::asio::error::connection_reset: case boost::asio::error::connection_aborted: throw Error(CR_SERVER_GONE_ERROR, "MySQL server has gone away"); case boost::asio::error::broken_pipe: throw Error(CR_BROKEN_PIPE, "MySQL server has gone away"); default: throw Error(CR_UNKNOWN_ERROR, error.message()); } } 

我有同样的问题,但改变[mysqld]下的my.ini / my.cnf文件中的max_allowed_pa​​cket取得了诀窍。

添加一行

 max_allowed_packet=500M 

现在重新启动MySQL服务。

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

 $> mysqladmin variables -u user -p 

这将显示当前variables,在这种情况下是max_allowed_pa​​cket,正如有人在另一个答案中说的,你可以暂时设置它

 mysql> SET GLOBAL max_allowed_packet=1072731894 

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

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

您也可以以root身份(或SUPER权限)login数据库并执行操作

 set global max_allowed_packet=64*1024*1024; 

也不需要重新启动MySQL。 请注意,您应该修复my.cnf文件,如其他解决scheme中所述:

 [mysqld] max_allowed_packet=64M 

并确认你重新启动MySQL后的变化:

 show variables like 'max_allowed_packet'; 

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

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

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

  • 您的INSERT运行时间很长,客户端正在断开连接。 重新连接时,不select数据库,因此出现错误。 这里的一个select是从命令行运行你的batch file,并在参数中select数据库,像这样;

$ mysql db_name <source.sql

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

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

  1. 创build/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)

如果你在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

我在使用Mysql Cluster的时候遇到了这个错误,不知道这个问题是从集群使用还是不是。 由于错误是完全一样的,所以在这里给我解决scheme。 得到这个错误,因为数据节点突然崩溃。 但是当节点崩溃时,仍然可以使用cmd得到正确的结果:

 ndb_mgm -e 'ALL REPORT MEMORYUSAGE' 

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

但有一件事是奇怪的,我失去了一些查询的MySQL服务器后,当我使用cmd像show tables ,我仍然可以得到像33 rows in set (5.57 sec)的返回信息,但没有表信息显示。

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

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

服务器pipe理员可能会犯一些大的操作错误,例如分配的缓冲区大小大于架构的地址空间限制,或超过虚拟内存容量。 MySQL错误日志可能会有一些相关的信息; 无论如何,他们将会监督这一点。

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

如果这些答案都不能解决你的问题,我通过删除表格并自动重新创build它们来解决这个问题:

 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 

那么就使用这个备份与你的数据库,它会删除并重新创build你需要的表。

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

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

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