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配置文件):
注意改完配置要重启MySQL,当前会话也得重新连接才能读取新的全局参数。max_heap_table_size = 300M tmp_table_size = 300M
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
相关产品推荐
相关产品推荐

