MySQL 在插入大文件时出现“内存不足”错误。这个文件大小限制是从哪里产生的?

Ben*_*son 6 mysql memory

我正在使用 MySQL 数据库来存储文件。

我使用的表结构如下:

+--------------+----------+------+-----+---------+-------+
| Field        | Type     | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+-------+
| AttachmentID | int(11)  | NO   | PRI | NULL    |       |
| Data         | longblob | NO   |     | NULL    |       |
+--------------+----------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

INSERT我使用的命令尽可能简单:

INSERT INTO table (AttachmentID, Data) VALUES (attachmentID, attachmentData);
Run Code Online (Sandbox Code Playgroud)

很明显, whereattachmentID是一个int,并且attachmentData是一个大字节数组。

阅读了关于如何在数据库中存储文件的几个指南后,我max_allowed_packet将配置文件中的设置增加到“512M”,对于我实际插入的文件来说已经足够了。

这适用于 30MB - 40MB 的几个文件。但是,现在我要插入 90MB+ 范围内的较大文件,我收到“内存不足”异常,需要的字节数等于我尝试插入的文件的大小。

该服务器是一个虚拟服务器,分配了 4GB 的空间,并且没有其他可能干扰的运行。

为什么我会收到较大文件的内存不足错误,而不是较小的文件? 这个文件大小限制来自哪里?

我在下面包含了我的配置文件:

[client]
port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
skip-locking
key_buffer_size = 256M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 8
max_allowed_packet = 512M

ft_min_word_len=2

ignore-builtin-innodb
plugin-load=innodb=ha_innodb_plugin.so

log-bin=mysql-bin
binlog_format=mixed
server-id = 1

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout
Run Code Online (Sandbox Code Playgroud)

编辑:我可以成功创建INSERT一个大小为 41,586 KB 的文件,但不是 44,119 KB 中的一个。极限介于两者之间。

Sta*_*hns 1

您还应该检查您的前端应用程序/编程语言。例如,如果您使用 PHP,请检查 php.ini 文件(或 )中的upload_max_filesize and post_max_size. 将这些设置为您想要的值:upload_max_filesize = 100M post_max_size = 100M