导入大型sql文件时,MySQL服务器已经消失

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

“MySql服务器已经消失”

怎么办呢?

328980 次浏览

如果你使用默认值运行,那么你有很多空间来优化你的mysql配置。

我建议的第一步是将max_allowed_packet增加到128M。

然后下载MySQL Tuning Primer脚本并运行它。它将为您的配置提供几个方面的建议,以获得更好的性能。

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

你要导入的文件有多大(文件大小),你能使用mysql命令行客户端而不是PHPMyAdmin导入文件吗?

在这里所述:

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

服务器超时并关闭连接。如何修复:

  1. 检查mysqld的my.cnf配置文件中的wait_timeout变量足够大。在Debian上:sudo nano /etc/mysql/my.cnf,设置wait_timeout = 600秒(你可以 当错误2006消失时调整/减少这个值),然后sudo /etc/init.d / mysql重启> < /代码。我没有检查,但是默认值 Wait_timeout可能在28800秒左右(8小时)

  2. 服务器丢弃错误或过大的数据包。如果mysqld得到一个太大或不正确的包,它会假设有什么东西已经出错 客户端出错并关闭连接。你可以增加 的值来限制数据包的最大大小 my.cnf文件中的Max_allowed_packet。在Debian上:sudo nano /etc/mysql/my.cnf,设置max_allowed_packet = 64M(你可以 当错误2006消失时调整/减少这个值),然后sudo /etc/init.d / mysql重启> < /代码。< / p > < /李>

编辑:

注意,MySQL选项文件没有它们的命令作为注释可用(例如在php.ini中)。所以你必须在my.cnfmy.ini中输入任何更改/调整,并将它们放在mysql/data目录或任何其他路径中,在适当的选项组下,如[client][myslqd]等。例如:

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

然后重新启动服务器。要得到它们的值,在mysql客户端中输入:

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

发生这种情况的另一个原因是内存不足。检查/var/log/messages,确保你的my.cnf没有设置成导致mysqld分配比你的机器更多的内存。

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

使用top并在它运行时观察内存分配,看看您的净空是多少。

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

如果你在OS X上使用MAMP,你需要改变MySQL模板中的max_allowed_packet值。

  1. 你可以在下面找到:文件>编辑模板> MySQL my.cnf

  2. 然后只需搜索max_allowed_packet,更改值和 李保存。< / p > < / >

我有类似的错误,今天复制数据库(MySQL服务器已经离开…),但当我试图重新启动MySQL。服务器重启出错

ERROR! The server quit without updating PID ...
这是我解决它的方法: 我打开Applications/Utilities/并运行Activity Monitor

 quit mysqld

然后就能解决误差问题了

mysql.server restart

对我来说,这个解决方案不可行,所以我执行了

SET GLOBAL max_allowed_packet=1073741824;

在我的SQL客户端。

如果不能改变MYSql服务运行,你应该停止服务,并改变my.ini文件中的变量。

例如:

max_allowed_packet=20M

我更新了“max_allowed_packet”到1024M,但它仍然不能工作。结果发现我的部署脚本正在运行:

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

如果要这样做,请确保从命令行显式地指定一个更大的数字。

当我导入16gb的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,您还可以使用它来设置其中的一些或全部。

如果你在XAMPP上工作,那么你可以修复MySQL服务器已经消失的问题。

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

修改以下变量值

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500

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

请注意,从命令行导入数据似乎会阻塞在BLOB数据上,导致'MySQL server has gone away'错误。

为了避免这种情况,重新创建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备份一个几何列的表?< / > 所以使用像PhpMyAdmin这样的程序似乎是唯一的解决方案(上面提到的选项可以正确地转换GEOM列)

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

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M

我正在做一些大型的计算,涉及到mysql连接停留很长时间和大量的数据。我正面临这个“Mysql走开的问题”。所以我试着优化查询,但这并没有帮助我,然后我增加了mysql变量限制,默认设置为较低的值。

< p > < >强wait_timeout max_allowed_packet < /强> < / p >

对于任何适合你的限制,它应该是任何数字* 1024(字节)。您可以使用'Mysql -u username - p'命令登录到终端,并可以检查和更改这些变量限制。

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

如果立即失败,则放大max_allowed_packet变量;如果它仍然不工作,确保命令是有效的SQL。我的书有未转义的引号,把一切都搞砸了。

此外,如果可行,可以考虑将单个SQL命令的插入数量限制为1000。您可以创建一个脚本,通过重新引入INSERT…每n个插入部分。

我得到一个类似的错误。要解决这个问题,只需打开my.ini文件,在第36行更改最大允许数据包大小的值。max_allowed_packet = 20M

GoDaddy共享主机

在GoDaddy共享托管帐户上,调整PHP.ini等文件是很棘手的。然而,还有另一种方法,它非常适合我。(我刚刚成功上传了一个3.8Mb的.sql文本文件,包含3100行和145个cols。使用phpMyAdmin中的IMPORT命令,我得到了可怕的MySQL服务器已经消失了错误,没有进一步的信息。)

我发现马特·布彻的答案是正确的。和Matt一样,我也尝试过各种技巧,从将MySQL数据库导出成小块,到编写脚本将大的导入分解成小块。但以下是有效的方法:

(1) CPANEL—> FILES (group)—> BACKUP

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

(3a)直接在2b的右边,在“恢复一个MySQL数据库备份”的标题下
(3b)从您的本地驱动器
选择。sql导入文件 (3c)真正的幸福将属于你(很快....)我花了大约5秒

我可以使用这种方法导入单个表。我的数据库中没有其他任何东西受到影响——但这就是上面的步骤(2)的目的。

< p >指出:< br > a.如果您不确定如何创建. sql导入文件,请使用phpMyAdmin导出表并修改文件结构 < p >来源: 马特·布彻2010文章 < / p >

确保mysqld进程不会因为systemd这样的服务管理器而重新启动。

我在《流浪》中遇到过这个问题。配置调整没有帮助。原来这是系统杀死我的服务每次当它占用太多的内存。

如果增加max_allowed_packet没有帮助。

当我通过Sequel Pro将.sql文件导入我的数据库时,我得到了和你一样的错误。

在将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转储是两个zip文件,需要连接在一起,然后解压缩。我认为解压一开始就中断了,留下了一些奇怪的字符和编码。获得一个新的MySQL转储并正确地解压缩它对我来说很有效。

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

任何关于数据包大小或超时的解决方案对我都没有任何影响。我需要禁用ssl

mysql -u -p -hmyhost.com --disable-ssl db < file.sql

https://dev.mysql.com/doc/refman/5.7/en/encrypted-connections.html

我也有同样的问题

$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