“the table is full”错误90%源于tmp_table_size与max_heap_table_size中较小值过低,导致group by等操作的内存临时表溢出;二者须同步调至相同值(如256m),且需检查磁盘空间及tmpdir写权限。

“The table is full” 不是单一原因,但 90% 的情况和 tmp_table_size 或 max_heap_table_size 设置过低直接相关——尤其是执行 GROUP BY、ORDER BY、大结果集 JOIN 时临时表撑爆内存。
为什么改了 tmp_table_size 还报错?
因为 MySQL 实际使用的是 tmp_table_size 和 max_heap_table_size 中的较小值。哪怕你把 tmp_table_size 设成 2G,但 max_heap_table_size 还是默认 16M,那临时表最多只能用 16M,超了就强制落磁盘;如果磁盘上又没权限/空间写临时文件(比如 /tmp 满了),就会直接报 “The table is full”。
- 必须同时调整两个参数,且设为相同值(例如都设为
256M) - 会话级设置只影响当前连接:
SET SESSION tmp_table_size = 268435456;、SET SESSION max_heap_table_size = 268435456; - 全局生效要改配置文件,且必须重启 MySQL ——
[mysqld]下加两行:tmp_table_size = 256M和max_heap_table_size = 256M - 注意单位:MySQL 配置中不识别
GB,得写2G或2147483648;M可以,但MB无效
MEMORY 表真满了怎么办?
如果你建的是 ENGINE=MEMORY 表,它完全靠内存存数据,不支持磁盘回退。“The table is full” 就是真的内存不够了——不是临时表,是这张表自己满了。
- 先查这张表实际占多少:
SHOW TABLE STATUS LIKE 'your_table_name';看Data_length - 确认当前上限:
SHOW VARIABLES LIKE 'max_heap_table_size'; - 如果
Data_length接近或超过该值,说明确实撞墙了 - 临时救急可改会话级:
SET SESSION max_heap_table_size = 536870912;(512M),再INSERT或ALTER TABLE ... ENGINE=InnoDB; - 长期方案:别用
MEMORY存业务主表,改用InnoDB—— 它能自动溢出到磁盘,不会突然中断
硬盘空间其实也得看
MySQL 报 “The table is full”,有时根本不是参数问题,而是 /var/lib/mysql 所在分区满,或者 tmpdir(默认 /tmp)写不进临时文件。
- 运行
df -h看根分区或 MySQL 数据目录所在磁盘使用率,超 95% 就危险 - 查 MySQL 用的临时目录:
SELECT @@tmpdir;,然后df -h /tmp(或对应路径) - 清理无用大文件:
find /tmp -name "*.tmp" -type f -mtime +7 -delete(谨慎执行) - 临时换
tmpdir到大分区(需重启):tmpdir = /data/tmp写进my.cnf,并确保 MySQL 用户有读写权限
最容易被忽略的一点:max_heap_table_size 影响的不只是 MEMORY 表,它还参与决定内部临时表能否留在内存里。很多 DBA 只调 tmp_table_size,忘了它被另一个参数压制,结果调了白调。











