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

当前回答

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

添加一条线

max_allowed_packet=500M

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

其他回答

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

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

$> mysqladmin variables -u user -p 

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

mysql> SET GLOBAL max_allowed_packet=1072731894

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

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

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

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

当您创建的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上加载一个DB崩溃了,几乎把我逼疯了。

所以,也许这能帮你节省一些令人沮丧的时间……: -)

(MacOS 10.3, mysql 5.7)