MySQL,保存大blob

时间:2017-08-29 16:54:20

标签: mysql blob innodb

我正在测试用QT编写的处理保存在数据库中的PDF的应用程序,我无法尝试保存大于1Mb的任何应用程序崩溃的内容,在Goggle上读取最终更改MAX_ALLOWED_PACKET并让我救了blob。

我绘制了几个不同大小的PDF上传,我得到了大约200Kb /秒的保存文件。然后我惊讶地发现,检查数据库我发现任何超过5Mb的东西都不会存储。没有错误,似乎应用程序和MySQL之间的握手没问题,因为我没有收到任何错误。

我对MySQL和Oracle有一些经验,但我从未处理过Blob。 我在某个帖子上读到我应该尝试更改innodb_log_file_size的值(我试过2000000000),但MySQL告诉我它是一个只读变量。有些人可以帮我解决这个问题吗?我在Ubuntu上运行MySQL。

2 个答案:

答案 0 :(得分:1)

您收到错误并不奇怪,因为默认的innodb日志文件大小为48MB(50331648字节)。

您的innodb日志文件大小必须至少是您尝试保存的最大blob大小的10倍。换句话说,只有当blob不大于日志文件大小的1/10时,才能保存blob。这开始在MySQL 5.6中实施;在此之前,它是在手册中推荐的,但没有强制执行。

您可以更改日志文件大小,但需要重新启动MySQL服务器。这些步骤记录在此处:https://dev.mysql.com/doc/refman/5.7/en/innodb-data-log-reconfiguration.html

P.S。至于关于在数据库中存储图像而不是在磁盘上存储文件的注释,这是一个长期争论。有些人会明确表示将图像存储在数据库中是不好的,但论证的两边都有利弊。请参阅我对Should I use MySQL blob field type?

的回答

答案 1 :(得分:0)

比尔有直接的答案。但我建议你会得到越来越大的文件,然后达到一个又一个的限制。

同时,除非你有一个非常新的MySQL,否则更改$current_item = 273; $newPostKey = (get_post_status($current_item)) ? 'ID' : 'import_id'; $my_post = array( $newPostKey => $current_item, 'post_title' => 'This is the post title.', 'post_content' => 'This is the updated content.', ); $post_id = wp_update_post( $my_post, true ); 是一件痛苦的事。

如果你达到1GB,你将达到innodb_log_file_size的限制。即使你已经过了那么,你也会达到另一个硬限制--4GB,最大尺寸为max_allowed_packetLONGBLOB

我建议你硬着头皮

计划A:将文档放入文件系统或

计划B:将文档分块,存储到多个LONGTEXT行。这将避免所有限制,即使是4GB限制。但是代码在输入和输出上会很混乱。