当我试图获取一个大的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

当前回答

一般的错误是:

错误:2006 (CR_SERVER_GONE_ERROR) - MySQL服务器已经离开

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


mysql进口

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

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

为mysql添加force选项(-f)以继续执行其余的查询。 如果数据库有一些与缓存相关的大型查询,这是非常有用的。 增加服务器配置中的max_allowed_packet和wait_timeout(例如~/.my.cnf)。 使用——skip-extended-insert选项来分解大型查询来转储数据库。然后重新导入。 尝试为mysql应用——max-allowed-packet选项。


常见的原因

一般来说,这个错误可能意味着以下几种情况:

a query to the server is incorrect or too large, Solution: Increase max_allowed_packet variable. Make sure the variable is under [mysqld] section, not [mysql]. Don't afraid to use large numbers for testing (like 1G). Don't forget to restart the MySQL/MariaDB server. Double check the value was set properly by: mysql -sve "SELECT @@max_allowed_packet" # or: mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'" You got a timeout from the TCP/IP connection on the client side. Solution: Increase wait_timeout variable. You tried to run a query after the connection to the server has been closed. Solution: A logic error in the application should be corrected. Host name lookups failed (e.g. DNS server issue), or server has been started with --skip-networking option. Another possibility is that your firewall blocks the MySQL port (e.g. 3306 by default). The running thread has been killed, so retry again. You have encountered a bug where the server died while executing the query. A client running on a different host does not have the necessary privileges to connect. And many more, so learn more at: B.5.2.9 MySQL server has gone away.


调试

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

检查日志,例如: sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error") 通过mysql, telnet或ping函数(例如PHP中的mysql_ping)测试您的连接。 使用tcpdump嗅探MySQL通信(不适用于套接字连接),例如: Sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql |字符串 在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;
}

其他回答

我也有同样的问题,但改变my.ini/my.cnf文件下[mysqld]的max_allowed_packet。

添加一条线

max_allowed_packet=500M

现在重新启动MySQL服务,一旦你完成。

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

如果您已经尝试了所有这些解决方案,特别是将max_allowed_packet增加到最大支持的1GB,您仍然看到这些错误,这可能是您的服务器没有足够的空闲RAM内存可用…

解决方案=将服务器升级到更大的RAM内存,然后再试一次。

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

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

ndb_mgm -e 'ALL REPORT MEMORYUSAGE'

mysqld也可以正常工作。所以一开始,我不明白是怎么回事。大约5分钟后,ndb_mgm结果显示没有数据节点工作。然后我意识到问题所在。因此,尝试重新启动所有的数据节点,然后mysql服务器恢复正常,一切正常。

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

解决方案是增加选项文件中[mysqld]标记下的wait_timeout和connect_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
set GLOBAL delayed_insert_timeout=100000

引用