导入大型sql文件时,MySQL Server已消失


259

我试图通过phpMyAdmin导入一个大型sql文件...但是它一直显示错误

'MySql服务器已消失'

该怎么办?


3
您的max_allowed_pa​​cket和wait_timeout值是什么?
daemonofchaos 2012年

1
您可以尝试加倍max_allowed_packet。有点粗糙,但是如果可行,您可以找到一个合理的值。
娜妮2012年

1
感谢您对Cole Johnson的笑声。这太棒了!大声笑!:)
mbrinson

我经常碰巧看到它。但是我无法再次重现相同的错误。并且,因此意识到它可能是动态的。有时,如果客户端(例如从循环中)向服务器发送太多SQL,则可能会发生这种情况。找到此错误的实际原因很重要。还要检查查询日志中是否有重复的SQL模式,以找出线索。
Bimal Poudel 2014年

有时当磁盘空间不足时会收到此消息
pramodtech

Answers:


376

如前所述这里

MySQL服务器消失(错误2006)的两个最常见的原因(和修复)是:

服务器超时并关闭了连接。怎么修:

  1. 检查mysqld的my.cnf配置文件中的wait_timeout变量是否足够大。在Debian:上sudo nano /etc/mysql/my.cnf,设置wait_timeout = 600秒(当错误2006消失时,您可以调整/减小该值),然后设置sudo /etc/init.d/mysql restart。我没有检查,但是wait_timeout的默认值可能约为28800秒(8小时)。

  2. 服务器丢弃了不正确或太大的数据包。如果mysqld收到的数据包太大或不正确,则认为客户端出了点问题,并关闭了连接。您可以通过增加my.cnf文件中的max_allowed_pa​​cket值来增加最大数据包大小限制。在Debian:上sudo nano /etc/mysql/my.cnf,进行设置max_allowed_packet = 64M(当错误2006消失时,您可以调整/减小该值),然后sudo /etc/init.d/mysql restart

编辑:

请注意,MySQL选项文件尚无其命令作为注释可用(例如php.ini中的命令)。所以,你必须键入任何变化/ TWEAK my.cnfmy.ini并将它们放在mysql/data目录或以任何其它路径的选择,如适当的组下[client][myslqd]等。例如:

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

然后重新启动服务器。要获取它们的值,请输入mysql客户端:

> select @@wait_timeout;
> select @@max_allowed_packet;

72
就我而言,它是max_allowed_pa​​cket变量。它设置为默认值1 MB(可以通过运行SHOW VARIABLESMySQL查询来查看),并且我导入的文件有一些非常大的记录。我打开了my.ini文件(我正在运行Windows),并将其值设置为:max_allowed_packet = 64M,重新启动MySQL并重新运行了导入。
布伦特·马特泽

我正在使用Webissues将大文件上传到数据库。这有所帮助,谢谢... :-)
inf3rno 2013年

@BrentMatzelle这肯定解决了“ Mysql已经消失”的问题。谢谢!
阿斯普林

2
我找不到wait_timeout线
Oki Erie Rinaldi'3

4
如果是Windows(使用Xampp),则为my.ini文件和innodb_lock_wait_timeout
Ananda

98

对我来说,这个解决方案没有奏效,所以我执行了

SET GLOBAL max_allowed_packet=1073741824;

在我的SQL客户端中。

如果无法在运行MYSql服务的情况下更改此设置,则应停止该服务并更改“ my.ini”文件中的变量。

例如:

max_allowed_packet=20M

1
这在MAMP(OS X)上对我有用,而其他更流行的答案却没有。但这是永久的吗?
atwixtor

2
@atwixtor否,在重新启动服务器之前,要像这样设置变量。然后将它们重置为默认值。
d.raev 2015年

1
做到了这一点,在Windows上的测试XAMPP机器上,我必须同时修改php.ini文件(如答案中的@GBD所示)和MySQL配置文件my.ini才能使其正常工作。
Gruber 2015年

2
我建议您补充一点,您可以通过SHOW variables LIKE 'max_allowed_packet'
Arth 2015年

这不是永久性的,因为该值将在服务器重新启动(最终)时重置,但它不仅适用于当前会话。max_allowed_packet在一个客户端中设置,然后.sql在另一个会话中导入大文件将可以正常工作。
VoteyDisciple,2016年

21

如果您正在使用XAMPP,则可以通过以下更改来解决MySQL服务器已消失的问题。

打开您的my.ini文件,my.ini的位置为(D:\ xampp \ mysql \ bin \ my.ini)

更改以下变量值

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500

wamp的样本,max_allowed_pa​​cket = 64M
Andrew

19

如果您使用默认值运行,那么您还有很多空间可以优化mysql配置。

我建议的第一步是将max_allowed_pa​​cket增加到128M。

然后下载MySQL Tuning Primer脚本并运行它。它将为配置的多个方面提供建议,以提高性能。

另外,还要考虑在MySQL和PHP中调整超时值。

您要导入的文件有多大(文件大小),是否可以使用mysql命令行客户端而不是PHPMyAdmin导入文件?


谢谢,我已经将max_allowed_pa​​cket设置为16M,然后发现了这个问题并将其提高到32M,以为这肯定够了,但随后您的回答就可以了,128M肯定可以工作。我正在收集* .sql文件中的整个SQL语句仅被视为一个数据包?
伊利亚·林恩

8

如果在OS X上使用MAMP,则需要更改max_allowed_packetMySQL模板中的值。

  1. 您可以在以下位置找到它:文件>编辑模板> MySQL my.cnf

  2. 然后只需搜索max_allowed_packet,更改值并保存。


6

我用这个简短的/etc/mysql/my.cnf文件解决了我的问题:

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M

1
证实了这一点也适用于MySQL的v5.6.12上WAMP:在Windows上,添加“WAIT_TIMEOUT”和“max_allowed_pa​​cket的”线上面的[mysqld]部分:WAMP \ BIN \ mysql的\ mysql_version \ my.ini的
dean.huczok

感谢@dan解决了我的一岁问题哈哈,我从没在“ [mysqld]
shivgre”(

这适用于MySQL v5.7。my-default.ini默认情况下未创建,因此您需要创建它。
Rodolfo Velasco

5

发生这种情况的另一个原因是内存不足。检查/ var / log / messages并确保未设置my.cnf以使mysqld分配的内存比计算机的多。

您的mysqld进程实际上可以被内核杀死,然后由“ safe_mysqld”进程重新启动,而您没有意识到。

在运行时使用top并查看内存分配,以查看您的净空。

更改my.cnf之前先对其进行备份。


这就是造成我问题的原因。我添加了一个1GB的交换文件,它完全固定了它。
Pikamander2'9

5

在以16 GB的SQL文件导入时出现此错误和其他相关错误。对我来说,编辑my.ini并在[mysqld]部分中设置以下内容(基于不同的帖子):

max_allowed_packet      = 110M
innodb_buffer_pool_size=511M
innodb_log_file_size=500M
innodb_log_buffer_size = 800M
net_read_timeout        = 600
net_write_timeout       = 600

如果在Windows下运行,请转到控制面板,服务,然后查看MySQL的详细信息,然后将看到my.ini所在的位置。然后,在编辑并保存my.ini之后,重新启动mysql服务(或重新启动计算机)。

如果您使用的是HeidiSQL,则还可以使用它来设置其中的一些或全部。


2

我将“ max_allowed_pa​​cket”更新为1024M,但仍无法正常工作。事实证明我的部署脚本正在运行:

mysql --max_allowed_packet=512M --database=mydb -u root < .\db\db.sql

如果使用这种方式,请确保从命令行中显式指定更大的数字。


2

如果您的数据包括BLOB数据:

请注意,从命令行导入数据似乎会阻塞BLOB数据,从而导致“ MySQL服务器已消失”错误。

为了避免这种情况,请重新创建mysqldump,但带有以下--hex-blob标志:

http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_hex-blob

它将用十六进制值(而不是二进制文本)写出数据文件。

PhpMyAdmin还具有选项“以十六进制表示形式转储二进制列(例如,“ abc”变为0x616263”)”,该选项效果很好。

请注意,存在一个长期存在的错误(截至2015年12月),这意味着GEOM不对列进行转换: 使用mysqldump备份具有GEOMETRY列的表吗? 因此,使用PhpMyAdmin之类的程序似乎是唯一的解决方法(上述选项可以正确转换GEOM列)。


1

如果需要很长时间才能失败,则扩大wait_timeout变量。

如果立即失败,则扩大max_allowed_packet变量;如果它仍然不起作用,请确保该命令是有效的SQL。我的报价没有转义,把一切搞砸了。

另外,如果可行,请考虑将单个SQL命令的插入次数限制为1000个。您可以创建一个脚本,通过每n次插入重新引入INSERT ...部分来在单个语句中创建多个语句。


1

我有一个类似的错误..要解决这个问题,只需打开my.ini文件..此处第36行更改最大允许数据包大小的值,即 max_allowed_pa​​cket = 20M


1

确保由于诸如systemd之类的服务管理器,mysqld进程不会重新启动。

我在centos 7游刃有余时遇到了这个问题。配置调整没有帮助。原来是systemd在每次占用太多内存时杀死了mysqld服务。


0

我今天在复制数据库时遇到了类似的错误(MySQL服务器已消失...),但是当我尝试重新启动mysql.server restart时出现错误

ERROR! The server quit without updating PID ...

这就是我的解决方法:我打开了Applications / Utilities /并运行了Activity Monitor

 quit mysqld

然后能够解决错误问题

mysql.server restart

0

我正在做一些大型计算,其中涉及mysql连接以保持长时间和大量数据。我正面临着“ MySQL走开问题”。因此,我尝试优化查询,但没有帮助我,然后我增加了mysql变量限制,默认情况下将其设置为较低的值。

wait_timeout max_allowed_pa​​cket

在最适合您的范围内,它应该是Any Number * 1024(Bytes)。您可以使用“ mysql -u username-p ”命令登录到终端,并可以检查和更改这些变量限制。


0

对于GoDaddy共享托管

在GoDaddy共享托管帐户上,调整PHP.ini等文件非常棘手。但是,还有另一种方法,它对我来说效果很好。(我刚刚成功上传了一个3.8Mb .sql文本文件,该文件包含3100行和145个列。使用phpMyAdmin中的IMPORT命令,我得到的可怕的MySQL服务器已消失,并且没有更多信息。)

我发现Matt Butcher的回答正确。像Matt一样,我尝试了各种技巧,从以小块的大小导出MySQL数据库,到编写将大导入分成小导入的脚本。但是这是起作用的:

(1)CPANEL --->文件(组)--->备份

(2a)在“部分备份”标题下...
(2b)在“下载MySQL数据库备份”下
(2c)选择您的数据库并下载一个备份(此步骤可选,但是明智的选择)

(3a)直接在2b的右侧,在“还原MySQL数据库备份”标题下
(3b)从本地驱动器中选择.SQL导入文件
(3c)真正的幸福归您所有(不久...)。 5秒

我能够使用此方法导入单个表。我的数据库中的其他所有内容都没有受到影响-但这是上面步骤(2)旨在防止的内容。

注意事项:
一。如果不确定如何创建.SQL导入文件,请使用phpMyAdmin导出表并修改该文件结构。

消息来源: Matt Butcher 2010年文章


好的,请立即投票,但没有评论原因。此信息对某人无效吗?如果是这样,请分享-对我有用,这就是为什么我添加此答案。上面的其他答案对我不起作用,但是此解决方案有效。那么为什么要投票呢?如果您使用GoDaddy,但此方法对您不起作用,我想知道,以便为您提供帮助。但是,如果您不使用GoDaddy共享主机,为什么仅因为它不适用于您而拒绝投票?
cssyphus

0

如果增加max_allowed_packet没有帮助。

.sql通过Sequel Pro 将文件导入数据库时,出现与您相同的错误。

max_allowed_packet升级到后,错误仍然存​​在,512M因此我在命令行中使用以下命令运行导入:

mysql --verbose -u root -p DatabaseName < MySQL.sql

它给出了以下错误:

ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled

我发现了一些有用的StackOverflow问题:

就我而言,我的.sql文件有些损坏。我们得到的MySQL转储包含两个压缩文件,这些压缩文件需要连接在一起然后解压缩。我认为解压缩最初会被中断,从而使文件带有一些奇怪的字符和编码。获取一个新的MySQL转储并将其解压缩对我来说正常工作。

只是想在这里添加它,以防其他人发现增加max_allowed_packet变量没有帮助。



0

我有同样的问题

$image_base64 = base64_encode(file_get_contents($_FILES['file']['tmp_name']) );
$image = 'data:image/jpeg;base64,'.$image_base64;
$query = "insert into images(image) values('".$image."')";
mysqli_query($con,$query);

在phpmyadmin的\ xampp \ mysql \ bin \ my.ini文件中,我们仅获得

[mysqldump]
max_allowed_packet=110M

仅用于mysqldump -u root -p dbname。我通过将上面的代码替换为我的问题解决了

max_allowed_packet=110M
[mysqldump]
max_allowed_packet=110M
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.