在数字取证领域,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/字段.cc和 sql/intem_strfunc.cc了解详情。
根据本书摘录和 MySQL 文档中关于 max_allowed_packet 的内容,基本上你无法将 max_allowed_packet 超过 1G。但是,关于 BLOB 和文本数据调优,还有一个方面需要探索。
Server Fault 中的另一个问题针对 InnoDB 和 BLOB 做出以下断言:innodb_log_file_size和innodb_log_buffer_size如果你有很多大对象,那么合并后的大小必须大于你最大的 blob 对象的十倍。如果你没有这样做(你不应该这样做)[1,2]),其实没必要太过担心。查看 MySQL Performance Blog 以获取有关如何计算的详细报告。
还有另一个方面需要考虑:选择网络缓冲区长度(默认 16K)用作 MySQL 数据包的初始化大小。数据包可以动态扩展到 max_allowed_packet。它不可避免地会缩减回 net_buffer_length 指定的大小。net_buffer_length 的最大值为 1M。您可能希望将此值设置为 1M。如果您使用 1G,这可能没什么帮助,但也不会造成影响。
如果您确实想要一个大于 1G 的 MySQL 数据包,我引用的书摘会告诉您使用哪些源代码来定义 MySQL 数据包内部结构。您可以随意尝试提高限制。但是,如果代码假设 1G,除了设置明确的数字外,源代码可能有自己的内部限制。
我希望这些信息有帮助!