更新时间:2022-10-26 GMT+08:00

表空间膨胀问题

场景描述

在使用RDS for MySQL过程中,经常遇到表空间膨胀问题,例如:表中只有11774行数据,表空间却占用49.9GB,将该表导出到本地只有800M。

原因分析

场景1:DRS全量迁移阶段并行迁移导致

原因:DRS在全量迁移阶段,为了保证迁移性能和传输的稳定性,采用了行级并行的迁移方式。当源端数据紧凑情况下,通过DRS迁移到云上RDS for MySQL后,可能会出现数据膨胀现象,使得磁盘空间使用远大于源端。

场景2:大量删除操作后在表空间留下碎片所致

原因:当删除数据时,mysql并不会回收被删除数据占据的存储空间,而只做标记删除,尝试供后续复用,等新的数据来填补相应空间,如果一时半会,没有数据来填补这些空间,就造成了表空间膨胀,形成大量碎片;

可以通过如下SQL语句,查询某个表详细信息,DATA_FREE字段表示表空间碎片大小:

select * from information_schema.tables where table_schema='db_name' and table_name = 'table_name'\G 

解决方案

针对表空间膨胀的问题,可以进行表空间优化整理,从而缩小空间,执行如下SQL命令:

optimize table table_name;

注意:optimize table命令会有短暂锁表操作,所以进行表空间优化时,建议避开业务高峰期,避免影响正常业务的进行。