我试图通过phpMyAdmin导入一个大的sql文件...但它一直显示错误
'MySql服务器已经消失'
该怎么办?
如上所述here:
MySQL服务器的两个最常见的原因(和修复)已经消失(错误2006):服务器超时并关闭连接 . 如何修复:检查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小时)左右 . 服务器丢弃了不正确或过大的数据包 . 如果mysqld获取的数据包太大或不正确,则会假定客户端出现问题并关闭连接 . 您可以通过增加my.cnf文件中max_allowed_packet的值来增加最大数据包大小限制 . 在Debian:sudo nano /etc/mysql/my.cnf,设置max_allowed_packet = 64M(当错误2006消失时你可以调整/减小这个值),然后sudo /etc/init.d/mysql restart .
Edit: 请注意,MySQL选项文件的命令已经没有注释(例如在php.ini中) . 因此,您必须在 my.cnf 或 my.ini 中键入任何更改/调整,并将它们放在 mysql/data 目录或任何其他路径中,在适当的选项组下,例如 [client] , [myslqd] ...等,例如:[mysqld]wait_timeout = 600max_allowed_packet = 64M然后重启服务器 . 要获取它们的值,请键入控制台:select @@wait_timeout;select @@max_allowed_packet;
my.cnf
my.ini
mysql/data
[client]
[myslqd]
[mysqld]
wait_timeout = 600
max_allowed_packet = 64M
select @@wait_timeout;
select @@max_allowed_packet;
对我来说,这个解决方案没有成功,所以我执行了
SET GLOBAL max_allowed_packet=1073741824;
在我的SQL客户端中 .
如果无法在运行MYSql服务时更改此设置,则应停止该服务并更改“my.ini”文件中的变量 .
例如:
max_allowed_packet=20M
如果您使用默认值运行,那么您有很大的空间来优化您的mysql配置 .
我建议的第一步是将max_allowed_packet增加到128M .
然后下载MySQL Tuning Primer script并运行它 . 它将为您的配置的多个方面提供建议,以获得更好的性能 .
还要考虑在MySQL和PHP中调整超时值 .
您要导入的文件有多大(文件大小),是否可以使用mysql命令行客户端而不是PHPMyAdmin导入文件?
If you are working on XAMPP then you can fix the MySQL Server has gone away issue with following changes..
打开你的my.ini文件my.ini位置是(D:\ xampp \ mysql \ bin \ my.ini)
更改以下变量值
max_allowed_packet = 64M innodb_lock_wait_timeout = 500
如果在OS X上使用MAMP,则需要更改MySQL模板中的 max_allowed_packet 值 .
max_allowed_packet
您可以在以下位置找到它:文件>编辑模板> MySQL my.cnf
然后只需搜索 max_allowed_packet ,更改值并保存 .
希望这有助于某人 .
我用这个简短的/etc/mysql/my.cnf文件解决了我的问题:
[mysqld] wait_timeout = 600 max_allowed_packet = 100M
这可能发生的另一个原因是内存不足 . 检查/ var / log / messages并确保my.cnf未设置为导致mysqld分配的内存超过机器的内存 .
您的mysqld进程实际上可以被内核杀死,然后由“safe_mysqld”进程重新启动,而您却没有意识到这一点 .
使用top并在运行时观察内存分配,以查看您的余量是多少 .
在更改之前备份my.cnf .
当我以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,您也可以使用它设置部分或全部 .
If your data includes BLOB data:
请注意,从命令行导入数据似乎会阻塞BLOB数据,从而导致“MySQL服务器已消失”错误 .
要避免这种情况,请使用 --hex-blob 标志重新创建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列) .
GEOM
我将“max_allowed_packet”更新为1024M,但它仍然无效 . 事实证明我的部署脚本正在运行:
mysql --max_allowed_packet=512M --database=mydb -u root < .\db\db.sql
如果你这样做,请务必从命令行中明确指定一个更大的数字 .
如果失败需要很长时间,那么放大 wait_timeout 变量 .
wait_timeout
如果它立即失败,放大 max_allowed_packet 变量;它仍然无法正常工作,请确保该命令是有效的SQL . 我有未转义的引号,搞砸了一切 .
此外,如果可行,请考虑将单个SQL命令的插入数限制为1000.您可以创建一个脚本,通过每n次插入重新引入INSERT ...部分,从单个语句中创建多个语句 .
我得到了一个类似的错误...解决这个问题只需打开my.ini文件 . 在第36行更改最大允许数据包大小的值,即 . max_allowed_packet = 20M
重复数据库(MySQL服务器已经消失......)今天我有类似的错误,但是当我试图重启mysql.server时我得到了错误
ERROR! The server quit without updating PID ...
这就是我解决它的方法:我打开了Applications / Utilities /并运行了Activity Monitor
quit mysqld
然后能够解决错误问题
mysql.server restart
我正在做一些大型计算,涉及mysql连接,以保持长时间和繁重的数据 . 我正面对这个“Mysql go away issue” . 所以我尝试优化查询,但这没有帮助我然后我增加了mysql变量限制,默认设置为较低的值 .
wait_timeout max_allowed_packet
对于任何适合你的限制,它应该是任意数字* 1024(字节) . 您可以使用' mysql -u username - p '命令登录终端,并可以检查和更改这些变量限制 .
确保mysqld进程不会因为像systemd这样的服务管理器而重启 .
我在带有centos 7的流浪汉中遇到了这个问题 . 配置调整没有帮助 . 原来它是systemd,它每次占用太多内存时都会杀死mysqld服务 .
我通过Sequel Pro将 .sql 文件导入我的数据库时遇到了同样的错误 .
.sql
将 max_allowed_packet 升级到 512M 后错误仍然存在,因此我在命令行中运行导入,而不是:
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问题:
Enable binary mode while restoring a Database from an SQL dump
Mysql ERROR: ASCII '\0' while importing sql file on linux server
在我的情况下,我的 .sql 文件有点腐败或什么的 . 我们得到的MySQL转储有两个zip文件,需要连接在一起然后解压缩 . 我认为解压缩最初会被中断,文件会留下一些奇怪的字符和编码 . 获得一个新的MySQL转储和解压缩它适合我 .
只是想在这里添加它,以防其他人发现增加 max_allowed_packet 变量没有帮助 .
在GoDaddy共享主机帐户上,调整PHP.ini等文件很棘手 . 然而,还有另一种方式,它对我来说非常有效 . (我刚刚成功上传了一个3.8Mb的.sql文本文件,包含3100行和145列 . 使用phpMyAdmin中的IMPORT命令,我得到了可怕的MySQL服务器已经消失了,没有进一步的信息 . )
我发现Matt Butcher有正确的答案 . 和Matt一样,我尝试过各种各样的技巧,从一口大小的块中导出MySQL数据库,再到编写将大量导入到较小导入的脚本 . 但这是有效的:
(1)CPANEL --->文件(组)--->备份
(2a)在"Partial Backups" Headers 下......(2b)根据"Download a MySQL Database Backup"(2c)选择您的数据库并下载备份(此步骤是可选的,但明智的)
(3a)直接在2b的右边, Headers 为"Restore a MySQL Database Backup"(3b)从本地驱动器中选择.SQL导入文件(3c)真正的幸福将是你的(不久......)我花了大约5秒钟
我能够使用此方法导入单个表 . 我的数据库中没有其他任何东西受到影响 - 但这就是上面的步骤(2)旨在防范的 .
笔记:一个 . 如果您不确定如何创建.SQL导入文件,请使用phpMyAdmin导出表并修改该文件结构 .
消息来源:Matt Butcher 2010 Article
17 回答
如上所述here:
Edit: 请注意,MySQL选项文件的命令已经没有注释(例如在php.ini中) . 因此,您必须在
my.cnf
或my.ini
中键入任何更改/调整,并将它们放在mysql/data
目录或任何其他路径中,在适当的选项组下,例如[client]
,[myslqd]
...等,例如:[mysqld]
wait_timeout = 600
max_allowed_packet = 64M
然后重启服务器 . 要获取它们的值,请键入控制台:
select @@wait_timeout;
select @@max_allowed_packet;
对我来说,这个解决方案没有成功,所以我执行了
在我的SQL客户端中 .
如果无法在运行MYSql服务时更改此设置,则应停止该服务并更改“my.ini”文件中的变量 .
例如:
如果您使用默认值运行,那么您有很大的空间来优化您的mysql配置 .
我建议的第一步是将max_allowed_packet增加到128M .
然后下载MySQL Tuning Primer script并运行它 . 它将为您的配置的多个方面提供建议,以获得更好的性能 .
还要考虑在MySQL和PHP中调整超时值 .
您要导入的文件有多大(文件大小),是否可以使用mysql命令行客户端而不是PHPMyAdmin导入文件?
If you are working on XAMPP then you can fix the MySQL Server has gone away issue with following changes..
打开你的my.ini文件my.ini位置是(D:\ xampp \ mysql \ bin \ my.ini)
更改以下变量值
如果在OS X上使用MAMP,则需要更改MySQL模板中的
max_allowed_packet
值 .您可以在以下位置找到它:文件>编辑模板> MySQL my.cnf
然后只需搜索
max_allowed_packet
,更改值并保存 .希望这有助于某人 .
我用这个简短的/etc/mysql/my.cnf文件解决了我的问题:
这可能发生的另一个原因是内存不足 . 检查/ var / log / messages并确保my.cnf未设置为导致mysqld分配的内存超过机器的内存 .
您的mysqld进程实际上可以被内核杀死,然后由“safe_mysqld”进程重新启动,而您却没有意识到这一点 .
使用top并在运行时观察内存分配,以查看您的余量是多少 .
在更改之前备份my.cnf .
当我以16 GB SQL文件导入时,我遇到了此错误和其他相关错误 . 对我来说,编辑my.ini并在[mysqld]部分中设置以下内容(基于几个不同的帖子):
如果您在Windows下运行,请转到控制面板,服务,并查看MySQL的详细信息,您将看到my.ini的位置 . 然后在编辑并保存my.ini之后,重新启动mysql服务(或重新启动计算机) .
如果您使用的是HeidiSQL,您也可以使用它设置部分或全部 .
If your data includes BLOB data:
请注意,从命令行导入数据似乎会阻塞BLOB数据,从而导致“MySQL服务器已消失”错误 .
要避免这种情况,请使用
--hex-blob
标志重新创建mysqldump: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列) .我将“max_allowed_packet”更新为1024M,但它仍然无效 . 事实证明我的部署脚本正在运行:
如果你这样做,请务必从命令行中明确指定一个更大的数字 .
如果失败需要很长时间,那么放大
wait_timeout
变量 .如果它立即失败,放大
max_allowed_packet
变量;它仍然无法正常工作,请确保该命令是有效的SQL . 我有未转义的引号,搞砸了一切 .此外,如果可行,请考虑将单个SQL命令的插入数限制为1000.您可以创建一个脚本,通过每n次插入重新引入INSERT ...部分,从单个语句中创建多个语句 .
我得到了一个类似的错误...解决这个问题只需打开my.ini文件 . 在第36行更改最大允许数据包大小的值,即 . max_allowed_packet = 20M
重复数据库(MySQL服务器已经消失......)今天我有类似的错误,但是当我试图重启mysql.server时我得到了错误
这就是我解决它的方法:我打开了Applications / Utilities /并运行了Activity Monitor
然后能够解决错误问题
我正在做一些大型计算,涉及mysql连接,以保持长时间和繁重的数据 . 我正面对这个“Mysql go away issue” . 所以我尝试优化查询,但这没有帮助我然后我增加了mysql变量限制,默认设置为较低的值 .
wait_timeout max_allowed_packet
对于任何适合你的限制,它应该是任意数字* 1024(字节) . 您可以使用' mysql -u username - p '命令登录终端,并可以检查和更改这些变量限制 .
确保mysqld进程不会因为像systemd这样的服务管理器而重启 .
我在带有centos 7的流浪汉中遇到了这个问题 . 配置调整没有帮助 . 原来它是systemd,它每次占用太多内存时都会杀死mysqld服务 .
如果增加max_allowed_packet没有帮助 .
我通过Sequel Pro将
.sql
文件导入我的数据库时遇到了同样的错误 .将
max_allowed_packet
升级到512M
后错误仍然存在,因此我在命令行中运行导入,而不是:它给出了以下错误:
我发现了一些有用的StackOverflow问题:
Enable binary mode while restoring a Database from an SQL dump
Mysql ERROR: ASCII '\0' while importing sql file on linux server
在我的情况下,我的
.sql
文件有点腐败或什么的 . 我们得到的MySQL转储有两个zip文件,需要连接在一起然后解压缩 . 我认为解压缩最初会被中断,文件会留下一些奇怪的字符和编码 . 获得一个新的MySQL转储和解压缩它适合我 .只是想在这里添加它,以防其他人发现增加
max_allowed_packet
变量没有帮助 .For GoDaddy共享主机
在GoDaddy共享主机帐户上,调整PHP.ini等文件很棘手 . 然而,还有另一种方式,它对我来说非常有效 . (我刚刚成功上传了一个3.8Mb的.sql文本文件,包含3100行和145列 . 使用phpMyAdmin中的IMPORT命令,我得到了可怕的MySQL服务器已经消失了,没有进一步的信息 . )
我发现Matt Butcher有正确的答案 . 和Matt一样,我尝试过各种各样的技巧,从一口大小的块中导出MySQL数据库,再到编写将大量导入到较小导入的脚本 . 但这是有效的:
(1)CPANEL --->文件(组)--->备份
(2a)在"Partial Backups" Headers 下......
(2b)根据"Download a MySQL Database Backup"
(2c)选择您的数据库并下载备份(此步骤是可选的,但明智的)
(3a)直接在2b的右边, Headers 为"Restore a MySQL Database Backup"
(3b)从本地驱动器中选择.SQL导入文件
(3c)真正的幸福将是你的(不久......)我花了大约5秒钟
笔记:
一个 . 如果您不确定如何创建.SQL导入文件,请使用phpMyAdmin导出表并修改该文件结构 .
消息来源:Matt Butcher 2010 Article