在数字取证领域,1GB的数据包大小是非常常见的,我也遇到了麻烦。
使用内部的python脚本,我们从档案中提取文本,一些文件大到4GB,其中的文本可以轻松达到1GB。 然后我们使用Sphinxsearch使其可search。
所以,现在我正面临数据包太大的错误时,将这些文本插入数据库。
机器是64核心与64 GB的RAM,可以轻松handel Terrabytes。
所以我该怎么做?
另一个问题是,在<1GB数据包期间增加max_allow_packet是否也会增加内存使用量?
操作系统:Linux 2.6.39 Mysql:5.1和5.5
在改变max_allowed_packet之前,先让我们定义它。
根据“Understanding MySQL Internals”(ISBN 0-596-00957-7)的第99页 ,这里是第1-3段解释它:
MySQLnetworking通信代码是在这样的假设下编写的:查询总是合理的短,因此可以在一个块中被服务器发送和处理,这在MySQL术语中被称为包 。 服务器为内存分配一个临时缓冲区来存储数据包,并且它提出了足够的要求来完全适合它。 这种架构需要采取一些预防措施,以避免服务器内存不足 – 这个选项可以完成数据包大小的限制。
与此选项有关的代码可以在sql / net_serv.cc中find。 看看my_net_read() ,然后按照对my_real_read()的调用,并特别注意net_realloc() 。
这个variables也限制了许多string函数结果的长度。 有关详细信息,请参阅sql / field.cc和sql / intem_strfunc.cc 。
根据本书的摘录和max_allowed_packet上的MySQL文档,对于max_allowed_packet超过1G基本上没有什么可以做的。 但是,关于BLOB和文本数据调优还有一个方面需要探索。
服务器错误中的另一个问题就InnoDB和BLOB做了如下的断言:如果你有很多大的对象, innodb_log_file_size和innodb_log_buffer_size的组合必须大于你最大的对象的十倍。 如果你不这样做(你不应该[ 1,2 ]),真的没有必要打扰很多。 查看MySQL性能博客,了解如何计算的详细报告。
还有一个方面需要思考: net_buffer_length (默认16K)选项用作MySQL数据包的初始化大小。 数据包可以dynamic扩展到max_allowed_packet。 它不可避免地回缩到由net_buffer_length指定的大小。 net_buffer_length的最大值是1M。 您可能需要将其值设置为1M。 如果通过1G启动,可能没有什么帮助,但也不会伤害到任何一方。
如果你真的想要一个大于1G的MySQL数据包,我所引用的书籍节选告诉你使用什么源代码来定义MySQL数据包内部。 你可以自由地尝试提高极限。 但是,如果代码假定除了显式数字被设置为1G,那么源代码可能具有其自身的内部限制。
我希望这个信息有帮助!