当在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表示表中的碎片空间(单位:字节)。
回收表碎片空间
- 登录数据管理DMS 5.0。
在顶部菜单栏中,选择数据库开发 > 数据变更 > 无锁变更。
说明若您使用的是极简模式的控制台,请单击左上角的,选择
。配置无锁结构变更工单。具体操作,请参见通过无锁变更工单实现无锁结构变更。
实例在开启无锁结构变更后,执行无锁结构变更工单都会自动回收表碎片空间。但为确保系统更稳定地回收碎表空间,并减少对依赖该表或与该表有关联关系的其他表的影响。建议您在工单中使用如下任意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 '修改后的字段注释';