288

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

'MySql 服务器已经消失'

该怎么办?

4

19 回答 19

415

如此处所述:

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 中)。因此,您必须在my.cnf或中键入任何更改/调整,my.ini并将它们放在mysql/data目录或任何其他路径中,在适当的选项组下,例如[client],[myslqd]等。例如:

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

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

> select @@wait_timeout;
> select @@max_allowed_packet;
于 2012-09-14T13:25:16.083 回答
107

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

SET GLOBAL max_allowed_packet=1073741824;

在我的 SQL 客户端中。

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

例如:

max_allowed_packet=20M
于 2014-11-12T10:09:41.907 回答
26

如果您正在使用 XAMPP,那么您可以通过以下更改修复 MySQL 服务器已消失的问题。

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

更改以下变量值

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500
于 2015-09-30T09:42:14.307 回答
22

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

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

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

还要考虑在 MySQL 和 PHP 中调整你的超时值。

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

于 2012-09-14T13:24:46.023 回答
9

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

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

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

于 2014-03-19T12:06:38.303 回答
7

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

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M
于 2016-02-18T07:52:46.797 回答
6

当我以 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,您也可以使用它设置部分或全部这些。

于 2015-06-18T19:09:33.503 回答
5

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

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

使用 top 并在它运行时观察内存分配,看看你的余量是多少。

在更改之前备份 my.cnf。

于 2013-06-30T03:32:21.393 回答
3

我有同样的问题

$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
于 2020-06-13T06:10:15.860 回答
2

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

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

如果您以这种方式进行操作,请务必从命令行明确指定更大的数字。

于 2015-06-11T03:02:52.347 回答
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未转换列: Back up a table with a GEOMETRY column using mysqldump? 所以使用像 PhpMyAdmin 这样的程序似乎是唯一的解决方法(上面提到的选项确实可以正确转换 GEOM 列)。

于 2015-12-28T00:04:12.557 回答
1

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

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

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

于 2016-07-14T18:59:31.917 回答
1

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

于 2016-08-27T13:36:42.777 回答
1

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

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

于 2018-03-28T12:26:21.893 回答
0

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

ERROR! The server quit without updating PID ...

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

 quit mysqld

然后能够解决错误问题

mysql.server restart
于 2014-09-29T13:07:42.167 回答
0

我正在做一些大型计算,其中涉及 mysql 连接以保持很长时间和大量数据。我正面临这个“Mysql go away issue”。所以我尝试优化查询,但这对我没有帮助,然后我增加了默认设置为较低值的 mysql 变量限制。

wait_timeout max_allowed_pa​​cket

最适合您的应该是任意数字 * 1024(字节)。您可以使用“ mysql -u username -p ”命令登录到终端,并可以检查和更改这些变量限制。

于 2016-02-21T08:25:04.983 回答
0

对于 GoDaddy 共享主机

在 GoDaddy 共享主机帐户上,调整 PHP.ini 等文件很棘手。但是,还有另一种方法,它对我来说非常有效。(我刚刚成功上传了一个 3.8Mb 的 .sql 文本文件,包含 3100 行和 145 列。在 phpMyAdmin 中使用 IMPORT 命令,我得到了可怕的MySQL server has gone away错误,没有更多信息。)

我发现 Matt Butcher 的答案是正确的。像马特一样,我尝试了各种技巧,从以一口大小的块导出 MySQL 数据库,到编写将大型导入分解为较小导入的脚本。但这是有效的:

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

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

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

我能够使用此方法导入单个表。我的数据库中没有其他任何东西受到影响——但这就是上面的步骤 (2) 旨在防止的。

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

资料来源: Matt Butcher 2010 年文章

于 2018-02-06T03:04:02.910 回答
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 转储包含两个 zip 文件,需要将它们连接在一起然后解压缩。我认为解压缩最初被中断,使文件带有一些奇怪的字符和编码。获取一个新的 MySQL 转储并解压缩它对我有用。

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

于 2018-07-19T23:03:30.833 回答
0

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

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

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

于 2020-04-23T19:34:03.493 回答