目录
- 一、原因分析
-
- InnoDB 存储引擎特性
- 130G空间未释放的直接原因
- 二、空间回收方案
-
- 方案一:OPTIMIZE TABLE(推荐,Online DDL)
- 方案二:ALTER TABLE(更灵活的Online方式)
- 方案三:创建新表替换(最稳妥,可控制)
- 方案四:导出导入(极端情况)
- 三、操作前必做检查
-
- 重要注意事项
- 快速决策建议
这是MySQL中非常常见的问题。删除数据后空间不释放,根本原因在于MySQL的存储引擎机制。
一、原因分析
InnoDB 存储引擎特性
MySQL 5.7默认使用InnoDB引擎,它采用**表空间(Tablespace)**方式存储数据:
- 如果 innodb_file_per_table = OFF:数据存在共享表空间 ibdata1 中,永远无法缩小
- 如果 innodb_file_per_table = ON(5.6+默认):每个表有独立的 .ibd 文件,可以回收
130G空间未释放的直接原因
- 删除操作只更新了元数据和标记删除位,.ibd 文件物理大小不变
- 这些空间被InnoDB标记为\”可重用\”,后续INSERT操作会优先使用,但操作系统层面看文件还是130G
二、空间回收方案
方案一:OPTIMIZE TABLE(推荐,Online DDL)
— 查看当前表使用的引擎和大小
SHOW TABLE STATUS FROM prd2_sphmdm LIKE \’api_logs\’;
— 执行优化(MySQL 5.7支持Online DDL,期间允许DML操作)
OPTIMIZE TABLE prd2_sphmdm.api_logs;
特点:
- 重建表结构,整理碎片,回收未使用空间
- 5.7版本支持Online DDL,但会短暂锁表(最后阶段)
- 需要额外磁盘空间(约130G)用于重建过程



