当我尝试获取大型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
答案 0 :(得分:509)
max_allowed_packet=64M
将此行添加到my.cnf
文件中可以解决我的问题。
当列具有较大的值(导致问题)时,这很有用,您可以找到解释here。
在Windows上,此文件位于:“C:\ ProgramData \ MySQL \ MySQL Server 5.6"
在Linux(Ubuntu)上:/ etc / mysql
答案 1 :(得分:131)
您可以增加最大允许数据包
SET GLOBAL max_allowed_packet=1073741824;
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet
答案 2 :(得分:57)
由于某种原因,全局更新和my.cnf设置对我不起作用。将max_allowed_packet
值直接传递给客户端在这里工作:
mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql
答案 3 :(得分:33)
一般来说错误:
错误:2006(
CR_SERVER_GONE_ERROR
) - MySQL服务器已经消失
表示客户端无法向服务器发送问题。
mysql
import 在通过mysql
导入数据库文件的特定情况下,这很可能意味着SQL文件中的某些查询太大而无法导入,并且无法在服务器上执行,因此客户端在第一次发生错误时失败。
所以你有以下几种可能性:
为-f
添加强制选项(mysql
)以继续执行其余查询。
如果数据库有一些与缓存相关的大型查询无论如何都不相关,这很有用。
在服务器配置中增加max_allowed_packet
和wait_timeout
(例如~/.my.cnf
)。
使用--skip-extended-insert
选项转储数据库以分解大型查询。然后再次导入。
尝试对--max-allowed-packet
使用mysql
选项。
一般来说,这个错误可能意味着几件事,例如:
对服务器的查询不正确或太大,
解决方案:增加max_allowed_packet
变量。
确保变量位于[mysqld]
部分,而不是[mysql]
。
不要使用大数字进行测试(例如1G
)。
别忘了重启MySQL / MariaDB服务器。
仔细检查值是否已正确设置:
mysql -sve "SELECT @@max_allowed_packet" # or:
mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
您从客户端的TCP / IP连接获得超时。
解决方案:增加wait_timeout
变量。
您尝试在关闭服务器连接后运行查询。
解决方案:应纠正应用程序中的逻辑错误。
主机名称查找失败(例如DNS服务器问题),或服务器已使用--skip-networking
选项启动。
另一种可能性是您的防火墙阻止了MySQL端口(例如默认情况下为3306)。
正在运行的线程已被杀死,因此请重试。
您遇到了服务器在执行查询时死亡的错误。
在其他主机上运行的客户端没有必要的连接权限。
还有更多,请详细了解: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 | strings
在Linux上,使用strace
。在BSD / Mac上使用dtrace
/ dtruss
,例如
sudo dtruss -a -fn mysqld 2>&1
了解更多如何在26.5 Debugging and Porting MySQL调试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;
}
答案 4 :(得分:18)
以防万一,检查你可以使用的变量
$> mysqladmin variables -u user -p
这将显示当前变量,在本例中为max_allowed_packet,并且正如有人在另一个答案中所述,您可以暂时设置
mysql> SET GLOBAL max_allowed_packet=1072731894
在我的情况下,没有考虑cnf文件,我不知道为什么,所以SET GLOBAL代码确实有帮助。
答案 5 :(得分:14)
我解决了错误ERROR 2006 (HY000) at line 97: MySQL server has gone away
,并按顺序执行以下两个步骤成功迁移了&gt; 5GB sql文件:
像其他人推荐的那样创建了/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为osx10.8(i386)分发5.5.51
答案 6 :(得分:11)
我遇到了同样的问题但是在[mysqld]下的my.ini / my.cnf文件中更改了max_allowed_packet就成了伎俩。
添加一行
max_allowed_packet=500M
现在完成后重启MySQL服务。
答案 7 :(得分:11)
您也可以以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';
您也可以使用命令行,但这可能需要更新启动/停止脚本,这些脚本可能无法在系统更新和修补程序中使用。
根据要求,我在这里添加了自己的答案。很高兴看到它有效!
答案 8 :(得分:8)
解决方案是在wait_timeout
标记下的选项文件中为connect_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
块引用
答案 9 :(得分:6)
这里可能会发生一些事情;
INSERT
运行时间过长,客户端正在断开连接。当它重新连接时,它没有选择数据库,因此错误。这里的一个选项是从命令行运行批处理文件,并在参数中选择数据库,如此; $ mysql db_name&lt; source.sql
php
或其他语言运行您的命令。在每个长时间运行的语句之后,您可以关闭并重新打开连接,确保在每次查询开始时都已连接。答案 10 :(得分:5)
如果你在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
答案 11 :(得分:2)
我在使用Mysql Cluster时遇到此错误,我不知道这个问题是否来自群集使用情况。由于错误完全相同,所以在这里给出我的解决方案。 获取此错误是因为数据节点突然崩溃。但是当节点崩溃时,您仍然可以使用cmd获得正确的结果:
ndb_mgm -e 'ALL REPORT MEMORYUSAGE'
而且mysqld也能正常工作。首先,我无法理解错误。大约5分钟后,ndb_mgm结果显示没有数据节点正常工作。然后我意识到了这个问题。因此,尝试重新启动所有数据节点,然后mysql服务器又回来了,一切正常。
但有一件事对我来说很奇怪,在我丢失mysql服务器进行某些查询之后,当我使用像show tables
这样的cmd时,我仍然可以得到像33 rows in set (5.57 sec)
这样的返回信息,但没有表信息是显示。
答案 12 :(得分:2)
当您创建的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上加载数据库时崩溃了,这使我几乎疯了。
所以,也许这可以帮助您节省一些令人沮丧的时间...:-)
(MacOS 10.3,mysql 5.7)
答案 13 :(得分:0)
如果重新连接并获得连接ID 2,服务器几乎肯定会崩溃。
与服务器管理员联系,让他们诊断问题。没有非恶意SQL会导致服务器崩溃,mysqldump的输出肯定不应该。
可能的情况是服务器管理员发生了一些重大的操作错误,例如分配大于体系结构的地址空间限制的缓冲区大小,或者超过虚拟内存容量。 MySQL错误日志可能会有一些相关信息;如果他们有能力,他们会监控这个。
答案 14 :(得分:0)
这是一个非常罕见的问题,但是如果有人将整个/ var / lib / mysql目录复制为将其数据库迁移到另一台服务器的方法,我已经看到了这一点。它不起作用的原因是因为数据库正在运行并使用日志文件。如果/ var / log / mysql中有日志,它有时不起作用。解决方案是复制/ var / log / mysql文件。
答案 15 :(得分:0)
对于amazon RDS(这是我的情况),您可以将max_allowed_packet
参数值更改为以字节为单位的任何数值,这对您可能拥有的任何插入中的最大数据都有意义(例如:如果您有50mb插入中的blob值,将max_allowed_packet
设置为64M = 67108864),在新的或现有的parameter-group
中。然后将该参数组应用于您的MySQL实例(可能需要重新启动实例)。
答案 16 :(得分:0)
对于正在寻找数据库导入失败解决方案的Drupal 8用户:
在sql转储文件的末尾,可以有命令将数据插入“ webprofiler”表。 我想这是一些调试日志文件,对于站点正常工作并不重要,因此可以删除所有这些日志文件。我删除了所有这些插入,包括LOCK TABLES和UNLOCK TABLES(以及之间的所有内容)。它在sql文件的最底部。问题描述如下:
https://www.drupal.org/project/devel/issues/2723437
但是除了删除该表外,没有其他解决方案。
顺便说一句,我尝试了以上答案的所有解决方案,但没有其他帮助。
答案 17 :(得分:0)
我已经尝试了上述所有解决方案,但都失败了。
我最终使用了-h 127.0.0.1
而不是默认的var/run/mysqld/mysqld.sock
。
答案 18 :(得分:0)
如果您已经尝试过所有这些解决方案,尤其是。将 max_allowed_packet
增加到最大支持的 1GB
数量,但您仍然看到这些错误,这可能是因为您的服务器实际上没有足够的可用 RAM 内存......
解决方案 = 将您的服务器升级到更多 RAM 内存,然后重试。
注意:我很惊讶这个简单的解决方案在这个线程上讨论了 8 年多之后没有被提及......有时我们开发人员往往会想得太多。
答案 19 :(得分:0)
我在 XAMMP 中遇到了同样的问题
Metode-01:我在 D:\xampp\mysql\bin\my.ini
文件中更改了 max_allowed_packet,如下所示:
max_allowed_packet=500M
最后重启 MySQL 服务一次就大功告成了。
Metode-02:
如果您使用 XAMPP,则是更简单的方法。打开XAMPP控制面板,点击mysql部分的config按钮。
现在单击 my.ini,它将在编辑器中打开。将 max_allowed_packet 更新为您需要的大小。
然后重启mysql服务。单击 Mysql 服务上的停止再次单击启动。等待几分钟。
然后尝试再次运行您的 Mysql 查询。希望它会起作用。
答案 20 :(得分:-1)
如果这些答案都没有解决您的问题,我通过删除表并以这种方式自动重新创建它来解决它:
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
然后只需将此备份与您的数据库一起使用,它将删除并重新创建您需要的表。
然后你只备份数据,并做同样的事情,它会起作用。
答案 21 :(得分:-3)
如何使用这样的mysql客户端:
mysql -h <hostname> -u username -p <databasename> < file.sql