由于出现故障,我们在过去四个小时里一直在清理数据库问题,但故障原因mysqldump
还不够明确。我们遇到了以下错误:
mysqldump: Error 2020: Got packet bigger than "max_allowed_packet" bytes when dumping table "search_dataset" at row: 68014
这个设置到底是干什么的?显然不是 IP 数据包大小,因为我现在已将其设置为 32M。它为什么存在?
答案1
根据“了解 MySQL 内部原理”第 99 页(ISBN 0-596-00957-7),以下是第 1-3 段对此的解释:
MySQL 网络通信代码是在这样的假设下编写的:查询总是相当短,因此可以以一个块的形式发送到服务器并由服务器处理,这被称为包用 MySQL 术语来说。服务器为临时缓冲区分配内存来存储数据包,并请求足够的内存来完全容纳它。此架构需要采取预防措施以避免服务器内存耗尽——对数据包的大小进行限制,此选项可以实现这一点。
与此选项相关的代码位于 sql/net_serv.cc。 看一眼我的网络读取(),然后按照呼叫我的_真实_读取()并特别注意 净_realloc()。
此变量还限制了许多字符串函数结果的长度。请参阅sql/字段.cc和 sql/intem_strfunc.cc了解详情。
这可能是我见过的关于 max_allowed_packet 的最完整解释。我直接从书中输入了这 3 段内容。
答案2
文档在这里对此进行了详细解释:
“一个数据包或任何生成/中间字符串的最大大小。...”
该文档还继续讨论 BLOB 以及此设置如何与它们关联。