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

“MySql服务器已经消失”

怎么办呢?


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

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

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

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

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


如下所述:

Two most common reasons (and fixes) for the MySQL server has gone away (error 2006) are: Server timed out and closed the connection. How to fix: check that wait_timeout variable in your mysqld’s my.cnf configuration file is large enough. On Debian: sudo nano /etc/mysql/my.cnf, set wait_timeout = 600 seconds (you can tweak/decrease this value when error 2006 is gone), then sudo /etc/init.d/mysql restart. I didn't check, but the default value for wait_timeout might be around 28800 seconds (8 hours). Server dropped an incorrect or too large packet. If mysqld gets a packet that is too large or incorrect, it assumes that something has gone wrong with the client and closes the connection. You can increase the maximal packet size limit by increasing the value of max_allowed_packet in my.cnf file. On Debian: sudo nano /etc/mysql/my.cnf, set max_allowed_packet = 64M (you can tweak/decrease this value when error 2006 is gone), then sudo /etc/init.d/mysql restart.

编辑:

注意,MySQL选项文件没有它们的命令作为注释可用(例如在php.ini中)。所以你必须在my.cnf或my.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值。

你可以在文件>编辑模板> MySQL my.cnf 然后只需搜索max_allowed_packet,更改值和 保存。


我有类似的错误,今天复制数据库(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变量限制,默认设置为较低的值。

wait_timeout max_allowed_packet

对于任何适合你的限制,它应该是任何数字* 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,我得到了可怕的MySQL服务器已经离开错误,没有进一步的信息。)

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

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

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

(3a)在2b的右边,在“恢复MySQL数据库备份”的标题下 从您的本地驱动器中选择.SQL导入文件 (3c)真正的幸福将属于你(很快....)我只用了5秒钟

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

注: a.如果您不确定如何创建. sql导入文件,请使用phpMyAdmin导出表并修改文件结构。

来源: 马特·布彻2010文章


确保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错误:ASCII '\0'当导入sql文件在linux服务器上

在我的情况下,我的.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