关于phpmyadmin:MySQL服务器在导入大型sql文件时已经消失了

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
    /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.cnfmy.ini中键入任何更改/调整,并将它们放在mysql/data目录或任何其他路径中,在适当的选项组(如[client][myslqd]等)下,例如:[mysqld]wait_timeout = 600max_allowed_packet = 64M然后重新启动服务器。要获取它们的值,请在控制台中键入:select @@wait_timeout;select @@max_allowed_packet;


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

    1
    SET GLOBAL max_allowed_packet=1073741824;

    在我的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模板中更改max_allowed_packet值。

  • 您可以在:文件>编辑模板>mysql my.cnf中找到它。

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


  • 我用这个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数据:

    注意,从命令行导入的数据似乎会阻塞BLOB数据,导致"mysql server has go 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列)。


    我把"max-allowed-packet"更新到1024米,但它仍然不起作用。结果发现我的部署脚本正在运行:

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

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


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

    如果立即失败,请放大max_allowed_packet变量;它仍然不工作,请确保该命令是有效的SQL。我的引言毫无瑕疵,把一切都搞砸了。

    另外,如果可行,可以考虑将单个SQL命令的插入数限制为1000。您可以通过重新引入insert来创建一个脚本,该脚本可以从单个语句中创建多个语句…每N个插入部分。


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


    如果增加max_allowed_packet没有帮助。

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

    在将max_allowed_packet增加到512M之后,错误仍然存在,因此我在命令行中运行import,而不是使用:

    1
    mysql --verbose -u root -p DatabaseName < MySQL.sql

    出现以下错误:

    1
    ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled

    我发现了几个有用的stackoverflow问题:

    • 从SQL转储还原数据库时启用二进制模式
    • MySQL错误:在Linux服务器上导入SQL文件时使用ASCII''

    在我的情况下,我的.sql文件有点腐败或其他什么。我们得到的mysql转储文件有两个zip文件,需要连接在一起然后解压缩。我认为解压最初被中断了,留下了一些奇怪的字符和编码文件。获取一个新的MySQL转储文件,然后解压缩它,这对我来说很有效。

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


    我正在做一些大型计算,其中涉及到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服务。