MySQL服务器已经消失,阻碍了大型转储的导入


14

我正在尝试将大型SQL转储(2GB)导入到我的Mac上的本地mysql中。我过去已经能够执行此操作(我正在使用MAMP),但是现在在第7758行出现ERROR 2006(HY000):每次尝试导入转储时,MySQL服务器都消失了。该数据库包含innodb表。

我尝试将my-innodb-heavy-4G.cnf文件复制到my.cnf中,以查看这些设置是否有帮助,但是没有运气。

有什么想法要调整吗?

我正在从此处使用“ Mac OS X版本10.6(x86,64位),DMG存档”:http : //dev.mysql.com/downloads/mysql/

Answers:


15

MySQL包是MySQL连接的无声杀手之一。甚至MySQL复制的I / O线程也可能因此而受害。

根据MySQL文档

  • 如果您向服务器发送不正确或太大的查询,也会收到这些错误。如果mysqld收到的数据包太大或顺序混乱,则认为客户端出了点问题,并关闭了连接。如果需要大型查询(例如,如果使用大型BLOB列),则可以通过设置服务器的max_allowed_pa​​cket变量来增加查询限制,该变量的默认值为1MB。您可能还需要增加客户端上的最大数据包大小。有关设置数据包大小的更多信息,请参见第C.5.2.10节“数据包太大”。

  • 插入很多行的INSERT或REPLACE语句也可能导致此类错误。这些语句中的任何一个都将单个请求发送到服务器,而与要插入的行数无关。因此,通常可以通过减少每个INSERT或REPLACE发送的行数来避免该错误。

至少,您必须确保mysqldump所在的计算机和正在加载的计算机的数据包大小相同。

您可以采取两种(2)方法:

方法#1:使用--skip-extended-insert执行mysqldump

这将确保MySQL数据包不会被多个BLOB,TEXT字段淹没。这样,一次执行一次SQL INSERT。主要缺点是

  1. mysqldump要大得多
  2. 重新加载这样的转储需要更长的时间。

方法2:增加max_allowed_pa​​cket

这可能是首选方法,因为实现此功能仅需重启mysql。了解什么是MySQL数据包可以澄清这一点。

根据“了解MySQL内部知识”(ISBN 0-596-00957-7)第99页,下面是对其进行解释的第1-3段:

MySQL网络通信代码是在假设查询总是相当短的前提下编写的,因此可以以一个块的形式发送到服务器并由服务器进行处理,这在MySQL术语中称为数据包。服务器为临时缓冲区分配内存以存储数据包,并且它请求足够完全容纳它。这种体系结构需要采取预防措施,以避免服务器用尽内存-限制数据包大小,此选项可以实现此目的。

与该选项有关的感兴趣的代码位于 sql / net_serv.cc中。看一下my_net_read(),然后跟随对my_real_read()的调用,并特别注意 net_realloc()

此变量还限制了许多字符串函数的结果的长度。有关详细信息,请参见sql / field.ccsql / intem_strfunc.cc

有了这个解释,批量批量插入将相当快地加载/卸载一个MySQL数据包。当max_allowed_pa​​cket对于给定的数据负载过小时,尤其如此。

结论

在大多数MySQL安装中,我通常将其设置为256M或512M。当数据加载产生“ MySQL走开”错误时,应使用较大的值进行实验。


我尝试设置 max_allowed_packet为900M,但我正在使用--skip-extended-insert(而且您是对的-这对hubuge db-dumps很有帮助),但仍然失败。我怀疑转储中的特定行现在可以解决了。但这仍然很奇怪-转储可以在我的CentOS服务器上很好地导入。
naxoc 2011年

我最终从sql dump中删除了一条插入内容,该插入内容非常长。这样就解决了(不需要该行)。
naxoc 2011年

顺便说一句,请确保MacOSX操作系统和MySQL支持数据转储的默认字符。
RolandoMySQLDBA 2011年

@naxov-我只是对您怀疑转储中的那一行感到好奇。是否涉及任何TEXT或BLOB字段?
RolandoMySQLDBA 2011年

是的,文本字段很长。
naxoc 2011年

2

超时前需要运行多长时间?第一步是检查wait_timeoutinteractive_timeout设置,以确保它们足够大以进行导入:

SHOW VARIABLES LIKE '%_timeout';
SET SESSION wait_timeout=28800;

默认值为8小时(28800),因此这可能不是问题。有关此问题的其他迹象,请参见此处。突出的是:

在其他主机上运行的客户端应用程序没有从该主机连接到MySQL服务器所需的特权。

首先验证权限,然后再检查该潜在问题列表。


都在本地主机上,所以我不明白您的意思,或者这不是问题。您是说权限与mysql中的特权一样吗?
naxoc 2011年

2

是的,通常使用wait_timeout和max_allowed_pa​​ckets可以使我也避开错误消息。


那对我没用。我必须在转储文件中编辑sql并删除导致问题的很长的一行。
naxoc 2011年

一个人不应该玩一些他不理解的参数
杰里德普(Jeredepp)

2

这样做可能不是“正确”的事情,但可能会奏效(完成工作吧?):

尝试将大型转储分成多个文件,然后依次运行一个文件。我的方法是将其分成两半并进行测试。然后将每一部分分成两半,重新测试,依此类推。

我有点好奇您盒中的RAM数量是否与此有关。MySQL运行时是否将整个转储加载到内存中?我不知道...但是,如果您只有2GB的RAM,并且其中一些正在使用中运行您的OS和其他应用程序,则可能是问题所在。


2

那些未能获得其他建议的人可以考虑看看BigDump PHP交错的MySQL转储导入程序脚本

这是将大型数据库转储导入MySQL的解决方法。我已经成功地使用它将大型MySQL转储导入到本地开发环境中(在这种情况下,我正在使用MAMP)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.