我首先想到的是max_allowed_packet实际控制的内容。这是我发现的:
根据“了解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。
给定max_allowed_packet的定义,然后我从ServerFault中发现了其他内容:如果您有很多大对象,则innodb_log_file_size和innodb_log_buffer_size的总和必须大于最大对象的十倍。
牢记这两件事,我将/etc/my.cnf中的innodb_log_file_size增加到允许的最大大小2047M。当然这需要以下
service mysql stop
rm -f /var/lib/mysql/ib_logfile*
service mysql start
这将容纳您数据中可能存在的任何大斑点。