回收表碎片空间

当在MySQL数据库中频繁地执行INSERT、UPDATE和DELETE语句,会导致数据在磁盘上不再连续存储,形成碎片化的存储空间(即碎片空间)。碎片空间的存在会导致数据库性能下降。常规的回收表空间碎片操作(例如Optimize Table回收表空间)可能会锁表并影响业务运行。本文为您介绍在DMS中提交无锁结构变更工单来自动整理并回收碎片空间,有效避免因数据库变更而导致的锁表阻塞业务问题,提高数据库性能和效率,并降低存储成本。

前提条件

注意事项

回收大容量表的碎片空间时,请确保实例剩余的存储空间大小至少为目标表大小的2~3倍,并在变更过程中密切关注实例剩余空间情况。

重要
  • 回收大容量表的碎片空间时,可能需要临时存储数据的副本或其他,这可能会导致额外的空间需求。如果空间不足,可能会导致回收碎片空间失败或者实例被锁定。

  • DMS是通过无锁结构变更对该表进行一次DDL变更来实现回收表碎片空间。所有DDL变更均存在失败的可能性,无法保证100%成功,请您知悉。

查看表碎片空间大小

您可在DMS的SQL Console中输入查看表碎片空间的SQL语句:SHOW TABLE STATUS LIKE 'table_name';。在SQL Console查询的具体操作,请参见SQL窗口介绍

查询结果示例图如下,Data_free表示表中的碎片空间(单位:字节)。

image.png

回收表碎片空间

  1. 登录数据管理DMS 5.0
  2. 在顶部菜单栏中,选择数据库开发 > 数据变更 > 无锁变更

    说明

    若您使用的是极简模式的控制台,请单击左上角的2022-10-21_15-25-22..png,选择全部功能 > 数据库开发 > 数据变更 > 无锁变更

  3. 配置无锁结构变更工单。具体操作,请参见通过无锁变更工单实现无锁结构变更

    实例在开启无锁结构变更后,执行无锁结构变更工单都会自动回收表碎片空间。但为确保系统更稳定地回收碎表空间,并减少对依赖该表或与该表有关联关系的其他表的影响。建议您在工单中使用如下任意SQL来整理、回收碎片空间:

    • ALTER TABLE table_name COMMENT '修改后的表的注释';

    • ALTER TABLE table_name ENGINE=InnoDB;

    • OPTIMIZE TABLE table_name;

    • ALTER TABLE table_name MODIFY COLUMN field_name INT COMMENT '修改后的字段注释';