ALTER TABLE logs ENGINE=InnoDB; -- 或 OPTIMIZE TABLE logs; SELECT table_name, data_free FROM information_schema.tables WHERE table_schema = 'db';
清理历史数据后执行 delete,表里记录少了很多,服务器磁盘占用几乎没变。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:InnoDB 删除只是标记空间可复用,数据文件不会自动缩小,碎片仍占用磁盘。
这次卡住的地方就在「MySQL 删除后空间不释放」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
处理上按这个顺序:确认表空间类型;用重建表回收空间;长期方案是按时间分区并直接删分区。
确认没问题再收工,表的数据文件明显变小,磁盘占用下降且查询性能恢复。