数据库磁盘占用一直涨,数据本身只有几 G,共享表空间文件却涨到几十 G,删了历史表也没释放。

排查方向其实有限,先把可能性排一排。共享表空间一旦扩展就不会自动收缩。还有一种是没有开启独立表空间,所有表数据挤在同一个文件。

另外,存在大量未提交事务或回滚段占用。

动手时先确认是否使用独立表空间

mysql -e 'show variables like \"innodb_file_per_table\"'

随后看各库表实际大小

mysql -e 'select table_schema,sum(data_length)/1024/1024 m from information_schema.tables group by 1'

再往下开启独立表空间

grep -n innodb_file_per_table /etc/my.cnf

评估重建实例回收空间

mysql -e 'show variables like \"innodb_undo_tablespaces\"'

白天有业务在跑,能验证的部分都压到了晚上做。

当时还开着另一个排查窗口,两边日志对照着看才定位到。

改完先别撤,确认这几项。新表按独立表空间存放,删表能释放磁盘,共享文件不再持续膨胀。

这里还有个坑。收缩共享表空间只能重建实例并重新导入,代价很大;建库时就该确认独立表空间是开启状态。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189