表空间膨胀问题
场景描述
在使用GaussDB(for MySQL)过程中,经常遇到表空间膨胀问题,例如:表中只有11774行数据,表空间却占用49.9GB,将该表导出到本地只有800M。
原因分析
场景1:DRS全量迁移阶段并行迁移导致
原因:DRS在全量迁移阶段,为了保证迁移性能和传输的稳定性,采用了行级并行的迁移方式。当源端数据紧凑情况下,通过DRS迁移到云上GaussDB(for MySQL)后,可能会出现数据膨胀现象,使得磁盘空间使用远大于源端。
场景2:大量删除操作后在表空间留下碎片所致
原因:当删除数据时,MySQL并不会回收被删除数据占据的存储空间,而只做标记删除,尝试供后续复用,等新的数据来填补相应空间,如果一时半会,没有数据来填补这些空间,就造成了表空间膨胀,形成大量碎片。
可以通过如下SQL语句,查询某个表详细信息,DATA_FREE字段表示表空间碎片大小:
- 更新统计信息
analyze table db_name.table_name;
- 查看碎片大小
select * from information_schema.tables where table_schema='db_name' and table_name = 'table_name'\G;
解决方案
针对表空间膨胀的问题,可以进行表空间优化整理,从而缩小空间,执行如下SQL命令:
optimize table table_name;
optimize table命令会有短暂锁表操作,所以进行表空间优化时,建议避开业务高峰期,避免影响正常业务的进行。