MySQL Server has gone away when importing large sql file
我试图通过phpmyadmin导入一个大的SQL文件…但它一直显示错误
'MySql server has gone away'
怎么办?
如这里所述:
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 , set
/etc/mysql/my.cnfwait_timeout = 600 seconds (you can
tweak/decrease this value when error 2006 is gone), thensudo . I didn't check, but the default value for
/etc/init.d/mysql restart
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 , set
/etc/mysql/my.cnfmax_allowed_packet = 64M (you can
tweak/decrease this value when error 2006 is gone), thensudo .
/etc/init.d/mysql restart
编辑:请注意,mysql选项文件没有可用的命令作为注释(例如,在php.ini中)。因此,您必须在
对我来说,这个解决方案不可行,所以我执行了
在我的SQL客户机中。
如果在mysql服务运行的情况下无法更改,则应停止该服务并更改"my.ini"文件中的变量。
例如:
1 | max_allowed_packet=20M |
如果您使用默认值运行,那么您有很大的空间来优化MySQL配置。
我建议的第一步是将允许的最大数据包增加到128m。
然后下载mysql调优入门脚本并运行它。它将为配置的几个方面提供建议,以获得更好的性能。
另外,还要研究在mysql和php中调整超时值。
您要导入的文件有多大(文件大小),是否可以使用mysql命令行客户机而不是phpmyadmin导入该文件?
如果您正在使用XAMPP,那么您可以通过以下更改修复MySQL服务器的问题。
打开my.ini文件my.ini位置是(d:xamppmysqlinmy.ini)
更改以下变量值
1 2 | max_allowed_packet = 64M innodb_lock_wait_timeout = 500 |
如果在OSX上使用mamp,则需要在MySQL模板中更改
您可以在:文件>编辑模板>mysql my.cnf中找到它。
然后只需搜索
我用这个short/etc/mysql/my.cnf文件解决了我的问题:
1 2 3 | [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]部分中设置以下内容(基于几个不同的文章):
1 2 3 4 5 6 | 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,那么也可以使用它设置其中的一部分或全部。
如果您的数据包括
注意,从命令行导入的数据似乎会阻塞BLOB数据,导致"mysql server has go away"错误。
要避免这种情况,请重新创建mysqldump,但使用
http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html option_mysqldump_hex-blob
它将用十六进制值而不是其他文本中的二进制值写出数据文件。
phpmyadmin还具有"以十六进制表示法转储二进制列"(例如,"abc"变为0x616263")选项,它工作得很好。
请注意,存在一个长期的错误(截至2015年12月),这意味着
我把"max-allowed-packet"更新到1024米,但它仍然不起作用。结果发现我的部署脚本正在运行:
1 |
如果您这样做的话,一定要从命令行中显式地指定一个更大的数字。
如果失败需要很长时间,则放大
如果立即失败,请放大
另外,如果可行,可以考虑将单个SQL命令的插入数限制为1000。您可以通过重新引入insert来创建一个脚本,该脚本可以从单个语句中创建多个语句…每N个插入部分。
我也有类似的错误……要解决这个问题,只需打开my.ini文件。在第36行更改最大允许数据包大小的值,即max_allowed_packet=20M
如果增加
当我通过Sequel Pro将
在将
1 | mysql --verbose -u root -p DatabaseName < MySQL.sql |
出现以下错误:
1 |
我发现了几个有用的stackoverflow问题:
- 从SQL转储还原数据库时启用二进制模式
- MySQL错误:在Linux服务器上导入SQL文件时使用ASCII' '
在我的情况下,我的
只是想在这里添加这个,以防其他人发现增加
我正在做一些大型计算,其中涉及到MySQL连接,以便长时间使用大量数据。我正面临着"MySQL离开问题"。所以我尝试不优化查询,但这对我没有帮助,然后我增加了mysql变量限制,默认设置为较低的值。
威特超时允许的最大数据包
对于您来说,它应该是任意数*1024(字节)。您可以使用'mysql-u username-p'命令登录到终端,并可以检查和更改这些变量限制。
我今天在复制数据库时也遇到了类似的错误(mysql服务器已经不在了…),但是当我试图重新启动mysql.server时,我得到了错误。
1 | ERROR! The server quit without updating PID ... |
我就是这样解决的:我打开了应用程序/实用程序/并运行了活动监视器
1 | quit mysqld |
然后能够解决错误问题
1 | mysql.server restart |
用于Godaddy共享托管
在godaddy共享托管帐户上,很难调整php.ini等文件。但是,还有另一种方法,它对我来说非常有效。(我刚刚成功上传了一个3.8MB的.sql文本文件,包含3100行和145列。使用phpmyadmin中的import命令,我得到了可怕的mysql服务器已经消失的错误,没有进一步的信息。)
我发现马特·布彻的回答是对的。和Matt一样,我也尝试过各种各样的技巧,从一口一口地导出MySQL数据库,到编写脚本,把大的导入分成小的导入。但这是有效的:
(1)cpanel--->文件(组)--->备份
(2a)在"部分备份"标题下…(2b)在"下载MySQL数据库备份"下(2c)选择数据库并下载备份(此步骤是可选的,但很明智)
(3a)直接在2b右侧,标题为"恢复MySQL数据库备份"(3b)从本地驱动器选择.sql导入文件(3c)真正的幸福将是你的(很快……)我的花了大约5秒钟。
I was able to use this method to import a single table. Nothing else in my database was affected -- but that is what step (2) above is intended to protect against.
笔记:a.如果您不确定如何创建.sql导入文件,请使用phpmyadmin导出表并修改该文件结构。
来源:Matt Butcher 2010文章
确保mysqld进程不会因为服务管理器(如systemd)而重新启动。
我和Centos 7在流浪时遇到了这个问题。配置调整没有帮助。原来是SystemD每次占用太多内存时都会杀死MySQLD服务。