“Table space is full”指InnoDB表空间满,需区分ibdata1(共享表空间,永不缩容)、ibtmp1(临时表空间,重启重置)或单个.ibd(独立表空间,索引设计不当易膨胀)。

Table space is full 错误到底在说哪个表空间
这个报错不是指磁盘满,而是 InnoDB 无法为新数据分配空间——它卡在了表空间层级。关键要分清是 ibdata1(共享表空间)还是某个 .ibd 文件(独立表空间)满了。错误日志里如果带路径如 /var/lib/mysql/your_db/your_table.ibd,那就是独立表空间;如果只提 tablespace 无具体文件,大概率是 ibdata1 或通用表空间撑到了上限。
检查 innodb_data_file_path 配置是否允许自动扩展
共享表空间扩容依赖 innodb_data_file_path 的配置。运行 SELECT @@innodb_data_file_path; 查看当前值。常见问题包括:
- 配置写成
ibdata1:12M(固定大小),没有:autoextend,后续无法增长 - 写成
ibdata1:12M;ibdata2:50M,但第二文件没加:autoextend,用完就停 - 路径指向的磁盘实际已满,
autoextend有心无力
修复方式:编辑 my.cnf,确保至少一个文件带 :autoextend,例如 ibdata1:12M:autoextend:max:2G(限制上限防失控),然后重启 MySQL —— 注意:仅修改配置不重启,变更不会生效。
独立表空间(.ibd)满时的直接处理方式
当报错明确指向某个 .ibd 文件(如 your_db/summary_log.ibd),且你已启用 innodb_file_per_table=ON,说明该表自身空间耗尽。此时:
- 先确认磁盘还有余量:
df -h /var/lib/mysql - 检查该表是否被锁死或正在执行大事务,用
SHOW PROCESSLIST;排查 - 若磁盘充足但 .ibd 不再增长,可能是
innodb_autoextend_increment设得太小(默认 64MB),导致频繁小扩展失败;可临时调大:SET GLOBAL innodb_autoextend_increment = 256; - 极端情况需手动优化:对大表执行
ALTER TABLE your_db.summary_log ENGINE=InnoDB;,会重建 .ibd 并释放碎片(注意锁表)
为什么 OPTIMIZE TABLE 对 ibdata1 无效
很多人试过 OPTIMIZE TABLE 或删表后空间仍不释放,是因为 innodb_file_per_table=OFF 时,所有表数据都挤在 ibdata1 里,而 ibdata1 只增不减。删表、清空、甚至 TRUNCATE 都只是标记空间“可用”,InnoDB 不会把这部分还给文件系统。
真正能缩小 ibdata1 的唯一办法是导出 + 重建:停库 → 删除 ibdata1、ib_logfile*、ibtmp1 → 确保 innodb_file_per_table=ON → 启动 → 导入 dump。这个过程必须停机,且 ibdata1 重建后仅存元数据(约 76MB),但 undo、change buffer 等仍占用其中——别指望它变成几 MB。


















