MySQL包是MySQL连接的无声杀手之一。甚至MySQL复制的I / O线程也可能因此而受害。
根据MySQL文档
如果您向服务器发送不正确或太大的查询,也会收到这些错误。如果mysqld收到的数据包太大或顺序混乱,则认为客户端出了点问题,并关闭了连接。如果需要大型查询(例如,如果使用大型BLOB列),则可以通过设置服务器的max_allowed_packet变量来增加查询限制,该变量的默认值为1MB。您可能还需要增加客户端上的最大数据包大小。有关设置数据包大小的更多信息,请参见第C.5.2.10节“数据包太大”。
插入很多行的INSERT或REPLACE语句也可能导致此类错误。这些语句中的任何一个都将单个请求发送到服务器,而与要插入的行数无关。因此,通常可以通过减少每个INSERT或REPLACE发送的行数来避免该错误。
至少,您必须确保mysqldump所在的计算机和正在加载的计算机的数据包大小相同。
您可以采取两种(2)方法:
方法#1:使用--skip-extended-insert执行mysqldump
这将确保MySQL数据包不会被多个BLOB,TEXT字段淹没。这样,一次执行一次SQL INSERT。主要缺点是
- mysqldump要大得多
- 重新加载这样的转储需要更长的时间。
方法2:增加max_allowed_packet
这可能是首选方法,因为实现此功能仅需重启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.cc和
sql / intem_strfunc.cc。
有了这个解释,批量批量插入将相当快地加载/卸载一个MySQL数据包。当max_allowed_packet对于给定的数据负载过小时,尤其如此。
结论
在大多数MySQL安装中,我通常将其设置为256M或512M。当数据加载产生“ MySQL走开”错误时,应使用较大的值进行实验。
max_allowed_packet
为900M,但我正在使用--skip-extended-insert
(而且您是对的-这对hubuge db-dumps很有帮助),但仍然失败。我怀疑转储中的特定行现在可以解决了。但这仍然很奇怪-转储可以在我的CentOS服务器上很好地导入。