You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MEMORY引擎表报ERROR 1114 (HY000)表已满,求解决方案

解决MySQL MEMORY引擎表加载报错ERROR 1114 (HY000): The table 'vendor_test' is full的思路

我之前也碰到过一模一样的问题——明明调大了max_heap_table_size还是报表满,后来才发现这里有几个容易忽略的关键点,一步步来排查:

1. 同步调整tmp_table_size参数

MySQL里MEMORY表的最大允许大小是**max_heap_table_size和tmp_table_size两者中的较小值**,只改其中一个等于白搭。很多人会忘了后者,默认值可能只有16MB或64MB,直接卡死了内存上限。

  • 先检查当前两个参数的实际值:
SHOW VARIABLES LIKE 'max_heap_table_size';
SHOW VARIABLES LIKE 'tmp_table_size';
  • 如果tmp_table_size小于300MB,把它也调到不低于max_heap_table_size:
    • 临时生效(重启MySQL后失效):
    SET GLOBAL tmp_table_size = 314572800; -- 300MB,单位是字节
    SET GLOBAL max_heap_table_size = 314572800;
    
    • 永久生效(修改my.cnf/my.ini配置文件):
    max_heap_table_size = 300M
    tmp_table_size = 300M
    
    注意改完配置要重启MySQL,当前会话也得重新连接才能读取新的全局参数。

2. 计算MEMORY表实际需要的内存

磁盘上的26MB是数据的磁盘存储大小,但MEMORY引擎在内存里的存储逻辑完全不一样:

  • VARCHAR会按定义的最大长度分配内存,不是实际数据长度
  • 索引(尤其是哈希索引)会额外占用不少内存
  • 每行数据还有固定的内存开销

你可以用SQL直接估算表需要的内存:

SELECT 
  table_name,
  data_length + index_length AS total_memory_bytes,
  (data_length + index_length)/1024/1024 AS total_memory_mb
FROM information_schema.tables 
WHERE table_schema = '你的数据库名' AND table_name = 'vendor_test';

如果估算出来的内存超过了300MB,那得继续调大参数。

3. 检查会话级参数是否生效

如果你用SET GLOBAL改了参数,但当前执行加载操作的会话还是旧的参数值,照样会报错。可以在当前会话里查一下:

SHOW SESSION VARIABLES LIKE 'max_heap_table_size';

要是和全局值不一致,就在当前会话里再设置一次:

SET SESSION max_heap_table_size = 314572800;
SET SESSION tmp_table_size = 314572800;

然后再尝试加载表。

4. 确认服务器物理内存是否充足

虽然概率不高,但如果服务器剩余物理内存远小于你设置的300MB,MySQL可能会拒绝分配更多内存给MEMORY表。可以用系统命令检查:

  • Linux:free -h
  • Windows:打开任务管理器查看内存占用
    如果内存吃紧,得先释放其他进程的内存,或者考虑升级服务器内存。

内容的提问来源于stack exchange,提问作者Artūras Kalandarišvili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:22:48