错误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
496465 次浏览

如何使用mysql客户端像这样:

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

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

  • 您的INSERT运行时间长,客户端正在断开连接。当它重新连接时,它没有选择数据库,因此出现了错误。这里的一个选项是从命令行运行批处理文件,并在参数中选择数据库,如下所示;

$ mysql db_name <source.sql

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

如果它正在重新连接并获得连接ID 2,那么服务器几乎肯定已经崩溃了。

联系服务器管理员,让他们诊断问题。任何非恶意SQL都不应该导致服务器崩溃,mysqldump的输出当然也不应该。

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

max_allowed_packet=64M

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

当列有大值时,这是有用的,这会导致问题,你可以找到解释在这里

在Windows上,这个文件位于:"C:\ProgramData\MySQL\MySQL Server . 5.6”< / p >

Linux操作系统(Ubuntu):“/etc/mysql”

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

获得正确的结果
ndb_mgm -e 'ALL REPORT MEMORYUSAGE'

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

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

您可以增加最大允许包数

SET GLOBAL max_allowed_packet=1073741824;

< a href = " http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html sysvar_max_allowed_packet " > http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html sysvar_max_allowed_packet < / >

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

添加一条线

max_allowed_packet=500M

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

如果这些答案都不能解决你的问题,我通过删除表,并以这种方式自动创建它们来解决它:

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

然后只需将此备份与您的db一起使用,它将删除并重新创建您需要的表。

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

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

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

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

$> mysqladmin variables -u user -p

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

mysql> SET GLOBAL max_allowed_packet=1072731894

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

解决方案是增加选项文件中wait_timeoutconnect_timeout参数的值,在[mysqld]标记下。

我必须恢复一个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

引用

如果你在Mac上,像我一样通过brew安装mysql,下面的方法是有效的。

  1. cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf

来源:对于自制mysql安装,where's my.cnf?

  1. max_allowed_packet=1073741824添加到/usr/local/etc/my.cnf

  2. mysql.server restart

您还可以以root(或SUPER特权)身份登录到数据库并执行该操作

set global max_allowed_packet=64*1024*1024;

不需要重新启动MySQL。注意,你应该修复你的my.cnf文件,正如在其他解决方案中概述的那样:

[mysqld]
max_allowed_packet=64M

重新启动MySQL后确认更改:

show variables like 'max_allowed_packet';

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

很高兴看到它工作!

一般的错误是:

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

意味着客户端无法向服务器发送问题


mysql进口

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

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

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

    如果数据库中有一些与缓存相关的大型查询,这是非常有用的

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

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

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


常见的原因

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

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

    解决方案:增加max_allowed_packet变量

    • 确保变量在[mysqld]节下,而不是[mysql]节下。

    • 不要害怕使用较大的数字进行测试(如1G)。

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

    • 仔细检查值是否设置正确:

      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.


Debugging

Here are few expert-level debug ideas:

  • Check the logs, e.g.

    sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
    
  • Test your connection via mysql, telnet or ping functions (e.g. mysql_ping in PHP).

  • Use tcpdump to sniff the MySQL communication (won't work for socket connection), e.g.:

    sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
    
  • On Linux, use strace. On BSD/Mac use dtrace/dtruss, e.g.

    sudo dtruss -a -fn mysqld 2>&1
    

    看到:开始使用DTracing MySQL < / p >

了解更多如何调试MySQL服务器或客户端:26.5调试和移植MySQL

作为参考,检查负责抛出客户端命令的CR_SERVER_GONE_ERROR错误的sql-common/client.c文件中的源代码。

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;
}

我解决了ERROR 2006 (HY000) at line 97: MySQL server has gone away错误,并成功迁移了一个>5GB sql文件,按顺序执行以下两步:

  1. 按照其他人的建议创建了/etc/my.cnf,内容如下:

    [mysql]
    connect_timeout = 43200
    max_allowed_packet = 2048M
    net_buffer_length = 512M
    debug-info = TRUE
    
  2. Appending the flags --force --wait --reconnect to the command (i.e. mysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnect).

Important Note: It was necessary to perform both steps, because if I didn't bother making the changes to /etc/my.cnf file as well as appending those flags, some of the tables were missing after the import.

System used: OSX El Capitan 10.11.5; mysql Ver 14.14 Distrib 5.5.51 for osx10.8 (i386)

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

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

对于寻找DB导入失败解决方案的Drupal 8用户:

在sql dump文件的末尾,可以命令插入数据到“webprofiler”表。 这是我猜一些调试日志文件,并不是真正重要的网站工作,所以所有这些可以删除。我删除了所有这些插入,包括LOCK TABLES和UNLOCK TABLES(以及两者之间的所有内容)。它在sql文件的最底部。问题描述:

https://www.drupal.org/project/devel/issues/2723437

但是除了截断该表之外,没有其他解决方案。

顺便说一句,我尝试了以上答案中的所有解决方案,其他都没有帮助。

我尝试了以上所有的解决方案,都失败了。

我最终使用了-h 127.0.0.1而不是默认的var/run/mysqld/mysqld.sock

当您创建的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)

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

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

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

我在XAMMP中遇到了同样的问题

我修改了D:\xampp\mysql\bin\my.ini文件中的max_allowed_packet,如下所示:

max_allowed_packet = 500

最后重新启动MySQL服务一次就完成了。

< >强Metode-02: < / >强

如果您使用XAMPP,更简单的方法。打开XAMPP控制面板,单击mysql部分中的config按钮。
enter image description here < / p >

现在点击my.ini,它将在编辑器中打开。将max_allowed_packet更新为所需的大小。

enter image description here

然后重新启动mysql服务。在Mysql服务上单击stop,再次单击start。等几分钟。 enter image description here enter image description here < / p >

然后再次运行Mysql查询。希望它能起作用。

max_allowed_packet=64M添加到[mysqld]

[mysqld]
max_allowed_packet=64M

重新启动MySQL服务器。

消除触发警告的错误是我的最终解决方案。我还改变了max_allowed_packet,这有助于较小的文件与错误。消除这些错误也会极大地加快这个过程。