MySQL:max_allowed_pa​​cket 大于 1 GB 可能吗?

MySQL:max_allowed_pa​​cket 大于 1 GB 可能吗?

在数字取证领域,1GB 的数据包大小非常常见,我遇到了麻烦。

我们使用内部的 python 脚本从档案中提取文本,一些文件大到 4 GB,其中的文本很容易达到 1GB。然后我们使用 Sphinxsearch 使其可搜索。

因此现在,当我将这些文本插入数据库时​​,我面临数据包太大的错误。

该机器有 64 个核心,配备 64 GB 内存,可以轻松处理 TB 级的数据。

所以我该怎么做?

另一个问题是,在 < 1GB 数据包期间,增加 max_allow_packet 是否也会增加内存使用量?

操作系统:Linux 2.6.39 Mysql:5.1 和 5.5

答案1

在改变之前最大允许数据包数,首先我们来定义一下。

根据“了解 MySQL 内部原理”第 99 页(ISBN 0-596-00957-7),以下是第 1-3 段对此的解释:

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

与此选项相关的代码位于 sql/net_serv.cc。 看一眼我的网络读取(),然后按照呼叫我的_真实_读取()并特别注意 净_realloc()

此变量还限制了许多字符串函数结果的长度。请参阅sql/字段.ccsql/intem_strfunc.cc了解详情。

根据本书摘录和 MySQL 文档中关于 max_allowed_pa​​cket 的内容,基本上你无法将 max_allowed_pa​​cket 超过 1G。但是,关于 BLOB 和文本数据调优,还有一个方面需要探索。

Server Fault 中的另一个问题针对 InnoDB 和 BLOB 做出以下断言:innodb_log_file_sizeinnodb_log_buffer_size如果你有很多大对象,那么合并后的大小必须大于你最大的 blob 对象的十倍。如果你没有这样做(你不应该这样做)[12]),其实没必要太过担心。查看 MySQL Performance Blog 以获取有关如何计算的详细报告。

还有另一个方面需要考虑:选择网络缓冲区长度(默认 16K)用作 MySQL 数据包的初始化大小。数据包可以动态扩展到 max_allowed_pa​​cket。它不可避免地会缩减回 net_buffer_length 指定的大小。net_buffer_length 的最大值为 1M。您可能希望将此值设置为 1M。如果您使用 1G,这可能没什么帮助,但也不会造成影响。

如果您确实想要一个大于 1G 的 MySQL 数据包,我引用的书摘会告诉您使用哪些源代码来定义 MySQL 数据包内部结构。您可以随意尝试提高限制。但是,如果代码假设 1G,除了设置明确的数字外,源代码可能有自己的内部限制。

我希望这些信息有帮助!

相关内容