我正在使用 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 中的一个。极限介于两者之间。
您还应该检查您的前端应用程序/编程语言。例如,如果您使用 PHP,请检查 php.ini 文件(或 )中的upload_max_filesize and post_max_size
. 将这些设置为您想要的值:upload_max_filesize = 100M post_max_size = 100M
。