错误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_packet
由于某种原因,全局更新和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_packet
和wait_timeout
(例如~/.my.cnf
)。 -
使用
--skip-extended-insert
选项转储数据库以分解大型查询。 然后再导入它。 -
尝试为
mysql
应用--max-allowed-packet
选项。
常见的原因
一般来说,这个错误可能意味着几件事情,比如:
-
对服务器的查询不正确或太大,
解决scheme: 增加
max_allowed_packet
variables 。-
确保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_timeout
variables 。 -
在与服务器的连接closures后,您试图运行查询。
解决scheme:应用程序中的逻辑错误应该得到纠正。
-
主机名称查找失败(例如,DNS服务器问题),或者服务器已经使用
--skip-networking
选项启动。另一种可能是您的防火墙阻止MySQL端口(例如,默认情况下为3306)。
-
正在运行的线程已被杀死,所以再次重试。
-
执行查询时遇到了服务器死亡的错误。
-
运行在不同主机上的客户端没有必要的连接权限。
-
还有更多,所以了解更多: B.5.2.9 MySQL服务器已经消失 。
debugging
这里有一些专家级的debugging思路:
-
检查日志,例如
sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
-
通过
mysql
,telnet
或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_packet取得了诀窍。
添加一行
max_allowed_packet=500M
现在重新启动MySQL服务。
以防万一,检查你可以使用的variables
$> mysqladmin variables -u user -p
这将显示当前variables,在这种情况下是max_allowed_packet,正如有人在另一个答案中说的,你可以暂时设置它
mysql> SET GLOBAL max_allowed_packet=1072731894
在我的情况下,CNF文件没有考虑到,我不知道为什么,所以SET GLOBAL代码真的帮助。
解决方法是在[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
您也可以以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文件:
- 创build/etc/my.cnf,如下所示:
[mysql] connect_timeout = 43200 max_allowed_packet = 2048M net_buffer_length = 512M debug-info = TRUE
- 附加标志
--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)
有关此更多信息,请参阅http://dev.mysql.com/doc/refman/5.5/en/gone-away.html或http://dev.mysql.com/doc/refman/5.1/en/gone -away.html(如适用)。
如果你在Mac上,并通过像我这样的brew来安装mysql,以下工作。
-
cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf
来源: 对于自制mysql安装,my.cnf在哪里?
-
添加
max_allowed_packet=1073741824
到/usr/local/etc/my.cnf
-
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