当我尝试获取大型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 回答
这里可能会发生一些事情;
INSERT
运行时间过长,客户端正在断开连接 . 当它重新连接时,它没有选择数据库,因此错误 . 这里的一个选项是从命令行运行批处理文件,并在参数中选择数据库,如下所示;php
或其他语言运行您的命令 . 在每个长时间运行的语句之后,您可以关闭并重新打开连接,确保在每个查询开始时都已连接 .将此行添加到
my.cnf
文件中可以解决我的问题 .当列具有较大的值,这会导致问题时,这很有用,您可以找到解释here .
您可以增加最大允许数据包
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet
由于某种原因,全局更新和my.cnf设置对我不起作用 . 将
max_allowed_packet
值直接传递给客户端在这里工作:一般来说错误:
意思是 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服务器 .
仔细检查值是否设置正确:
解决方案: Increase wait_timeout variable .
解决方案:应纠正应用程序中的逻辑错误 .
--skip-networking
选项启动 .另一种可能性是您的防火墙阻止了MySQL端口(例如默认情况下为3306) .
正在运行的线程已被杀死,因此请重试 .
您遇到了执行查询时服务器死机的错误 .
在不同主机上运行的客户端没有必要的连接权限 .
还有更多,请了解更多信息:B.5.2.9 MySQL server has gone away .
调试
以下是一些专家级调试思路:
通过
mysql
,telnet
或ping函数测试连接(例如PHP中的mysql_ping) .使用
tcpdump
来嗅探MySQL通信(不适用于套接字连接),例如:strace
. 在BSD / Mac上使用dtrace
/dtruss
,例如见:Getting started with DTracing MySQL
了解更多如何在以下位置调试MySQL服务器或客户端:26.5 Debugging and Porting MySQL .
作为参考,检查sql-common/client.c文件中的源代码,该文件负责抛出客户端命令的
CR_SERVER_GONE_ERROR
错误 .以防万一,检查你可以使用的变量
这将显示当前变量,在本例中为max_allowed_packet,并且正如有人在另一个答案中所说,您可以暂时设置它
在我的情况下,没有考虑cnf文件,我不知道为什么,所以SET GLOBAL代码真的有帮助 .
我解决了错误
ERROR 2006 (HY000) at line 97: MySQL server has gone away
并通过按顺序执行以下两个步骤成功迁移了> 5GB的sql文件:--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)
我有同样的问题,但在[mysqld]下的my.ini / my.cnf文件中更改max_allowed_packet就成了伎俩 .
添加一行
完成后立即重启MySQL服务 .
您也可以以root用户身份(或SUPER权限)登录数据库并执行此操作
也不需要重启MySQL . 请注意,您应该按照其他解决方案中的说明修复
my.cnf
文件:并确认之后的变化你重启了MySQL:
您也可以使用命令行,但这可能需要更新启动/停止脚本,这些脚本可能无法在系统更新和修补程序中存活 .
根据要求,我在这里添加自己的答案 . 很高兴看到它的作品!
解决方案是在
[mysqld]
标记下的选项文件中为wait_timeout
和connect_timeout
参数增加值 .我不得不恢复一个400MB的mysql备份,这对我有用(我在下面使用的值有点夸张,但你明白了):
如果你在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
有关此内容的更多信息,请参阅http://dev.mysql.com/doc/refman/5.5/en/gone-away.html或http://dev.mysql.com/doc/refman/5.1/en/gone-away.html .
我使用Mysql Cluster时遇到此错误,我不知道这个问题是否来自群集使用情况 . 由于错误完全相同,所以在这里给出我的解决方案 . 获取此错误,因为数据节点突然崩溃 . 但是当节点崩溃时,您仍然可以使用cmd获得正确的结果:
并且mysqld也能正常工作 . 首先,我无法理解什么是错的 . 大约5分钟后,ndb_mgm结果显示没有数据节点正常工作 . 然后我意识到了这个问题 . 因此,尝试重新启动所有数据节点,然后mysql服务器又回来了,一切正常 .
但有一件事对我来说很奇怪,在我丢失mysql服务器进行一些查询之后,当我使用像
show tables
这样的cmd时,我仍然可以得到像33 rows in set (5.57 sec)
这样的返回信息,但是没有显示表信息 .如果它重新连接并获得连接ID 2,则服务器几乎肯定会崩溃 .
联系服务器管理员并让他们诊断问题 . 没有非恶意SQL会导致服务器崩溃,mysqldump的输出肯定不应该 .
可能的情况是,服务器管理员发生了一些大的操作错误,例如分配大于体系结构的地址空间限制的缓冲区大小,或者超过虚拟内存容量 . MySQL错误日志可能会有一些相关信息;如果他们有能力,他们会监控这个 .
这是一个非常罕见的问题,但是如果有人将整个/ var / lib / mysql目录复制为将其数据库迁移到另一台服务器的方法,我已经看到了这一点 . 它不起作用的原因是因为数据库正在运行并使用日志文件 . 如果/ var / log / mysql中有日志,它有时不起作用 . 解决方案是复制/ var / log / mysql文件 .
对于amazon RDS(这是我的情况),您可以将
max_allowed_packet
参数值更改为任何数字值,以字节为单位,这对您可能拥有的任何插入中的最大数据有意义(例如:如果插入中有大约50mb blob值,则设置max_allowed_packet
到64M = 67108864),在新的或现有的_971309中 . 然后将该参数组应用于您的MySQL实例(可能需要重新启动实例) .如果这些答案都没有解决您的问题,我通过删除表并以这种方式自动重新创建它来解决它:
然后只需将此备份与您的数据库一起使用,它将删除并重新创建您需要的表 .
然后你只备份数据,并做同样的事情,它会工作 .
如何使用这样的mysql客户端: