磁盘空间充足但MySQL报1114表已满错误的排查求助
问题原因分析与解决办法
核心原因
别被虚拟机(Guest系统)里的根分区剩余空间给迷惑了!这个报错的关键问题出在VirtualBox主机的剩余磁盘空间不足上,而非你虚拟机内的MySQL配置或分区空间:
- InnoDB执行
ALTER TABLE(尤其是添加自增主键、新字段这类操作)时,会创建与原表规模相当的临时表来存储中间数据。虽然你虚拟机里的根分区还有11G剩余,但你的虚拟机磁盘大概率是动态分配格式(比如VDI)——虚拟机的磁盘文件实际存储在主机上,当虚拟机需要扩容磁盘空间来容纳临时表时,主机仅剩的3G空间根本无法支撑,最终导致InnoDB无法完成临时表创建,触发1114 The table 'article' is full错误。 - 补充:哪怕你用了InnoDB独立表空间(
article.ibd),ALTER操作的临时数据仍需要额外磁盘空间,主机空间不足直接掐断了这个可能性。
解决方法
按优先级给你几个可行方案:
紧急清理主机空间(最快见效)
立刻清理主机上的冗余文件(比如旧虚拟机快照、闲置下载文件、过期日志等),至少腾出10G以上剩余空间(临时表所需空间基本和原表大小相当,你的原表是8.4G,留足余量更稳妥),清理完成后重新执行ALTER TABLE语句即可。用在线DDL工具替代原生ALTER(适合主机空间无法大幅扩容的情况)
如果你主机实在腾不出足够空间,可以使用Percona的pt-online-schema-change工具执行在线DDL操作。它不会创建全量临时表,而是分批将原表数据复制到新表中,占用临时空间小很多,还能避免锁表影响业务。执行示例如下:pt-online-schema-change --alter "ADD COLUMN intId INT AUTO_INCREMENT PRIMARY KEY, ADD COLUMN categoryIntId INT, ADD COLUMN sourceIntId INT" D=数据库名,t=article --execute注意操作前先在测试环境验证,且尽量选业务低峰期执行。
调整虚拟机磁盘配置(长期解决方案)
- 若经常需要处理大表DDL,建议把虚拟机磁盘改成预分配空间格式,避免动态扩容时依赖主机剩余空间;
- 直接扩大虚拟机磁盘容量,同时确保主机有足够剩余空间容纳扩容后的虚拟机磁盘文件。
额外排查:确认MySQL临时目录空间
虽然核心问题是主机空间,但也可以顺带检查MySQL临时目录配置:执行SHOW VARIABLES LIKE 'tmpdir';,确认tmpdir指向的目录所在分区有足够空间(你的情况里根分区剩11G,这部分应该没问题)。
内容的提问来源于stack exchange,提问作者Nihau
相关产品推荐
相关产品推荐

