“The table is full” 错误实际由表空间耗尽或文件系统限制引发,需依次排查共享表空间(ibdata1)未启用autoextend、独立表空间(.ibd)达文件系统单文件上限、底层磁盘空间不足三层原因。

“The table is full” 不是磁盘满,而是表空间耗尽或文件系统限制触发的 InnoDB 报错,必须立刻定位是哪一层卡住了。
先查清到底是哪个“满”
这个错误常被误认为磁盘空间不足,但实际多由以下三类原因导致:
-
innodb_data_file_path定义的共享表空间(ibdata1)已写满,且未配置autoextend - 单表启用了独立表空间(
innodb_file_per_table=ON),但该表的.ibd文件达到文件系统单文件大小上限(如 ext4 默认 16TB,但某些旧内核或 NAS 可能更低) - 底层文件系统本身剩余空间不足(
df -h确实Use%接近 100%)
执行这条查询快速判断归属:
SELECT table_schema, table_name, engine, round((data_length+index_length)/1024/1024, 2) size_mb FROM information_schema.tables WHERE table_name = 'your_table_name' AND table_schema = 'your_db_name';
再运行:
SELECT file_name, tablespace_name, round(bytes/1024/1024, 2) size_mb, autoextensible FROM information_schema.innodb_sys_datafiles;
如果返回为空或 autoextensible 是 NO,基本锁定是共享表空间没开自动扩展。
共享表空间(ibdata1)扩容要停机重配
这是最麻烦的一类:InnoDB 共享表空间一旦初始化,innodb_data_file_path 就不能在线修改。想扩容必须停 MySQL、改配置、再启动——而且仅适用于仍用共享表空间的老部署(新实例默认 innodb_file_per_table=ON)。
- 确认当前配置:
SHOW VARIABLES LIKE 'innodb_data_file_path';,典型值如ibdata1:12M:autoextend - 若没有
:autoextend,需在my.cnf中显式补上,并指定初始大小(如ibdata1:1G:autoextend:max:50G) - ⚠️ 注意:
max是硬上限,设太小后续还会报 same 错;设太大又浪费磁盘预留空间 - 改完必须重启 MySQL,期间服务中断
不推荐在生产环境长期依赖共享表空间,尤其当 ibdata1 已超几十 GB——它无法收缩,undo、change buffer 等都堆在里面,越用越大。
独立表空间(.ibd)扩容靠迁移+重建
如果你的表是 ENGINE=InnoDB 且 innodb_file_per_table=ON(绝大多数现代部署),那 “The table is full” 很可能是因为该表的 .ibd 文件触达了文件系统单文件大小限制,或内部碎片严重导致无法分配新页。
- 先检查该表是否真启用了独立表空间:
SHOW CREATE TABLE your_table_name;看输出里有没有TABLESPACE `innodb_system`(共享)或空(默认独立) - 对大表执行
OPTIMIZE TABLE your_table_name;—— 这会重建.ibd,回收碎片、重排数据,往往能立即释放空间并避免报错 - 如果
OPTIMIZE失败(提示Table is full),说明磁盘真的快满了,或.ibd已达文件系统上限;此时需:- 清理磁盘(
rm无用 binlog / slow log / tmp files) - 或把表迁到另一块有足够空间的磁盘:
ALTER TABLE your_table_name TABLESPACE = innodb_file_per_table;不行,得用mysqldump+mysql重建,或 Percona XtraBackup 切换路径
- 清理磁盘(
别忽略文件系统和临时空间
即使表空间还有余量,MySQL 在执行大排序、GROUP BY、JOIN 或大事务时会生成大量临时文件(/tmp 或 innodb_tmpdir),这些也受磁盘配额和单文件限制约束。
- 查临时目录位置:
SHOW VARIABLES LIKE 'tmpdir';或SHOW VARIABLES LIKE 'innodb_tmpdir'; - 检查该路径所在分区是否
df -h满了,或是否挂载了noexec/nosuid等限制选项 - 临时增大
tmpdir到空间充足的路径(需重启或动态 SET,但部分版本不支持动态改) - 调低
sort_buffer_size、join_buffer_size避免单次操作申请过大内存转而写磁盘
真正棘手的是:同一个错误可能在不同时间由不同层触发——这次是 ibdata1 写满,下次可能是某张大表的 .ibd 卡在 16TB 边界,再下次是 /tmp 分区被慢查询塞爆。必须每次见错先 df、SHOW VARIABLES、SELECT ... FROM innodb_sys_datafiles 三连查,而不是直接开干扩容。


















