使用DELETE语句删除数据时,只是将记录的位置或者数据页标记为可复用,但是存储空间中文件的大小不会改变,即表空间不会直接被回收。此时,您可以通过执行OPTIMIZE TABLE命令或DMS工具来回收表空间。
使用DMS工具或OPTIMIZE TABLE命令均可以回收表空间,两种方式的各自特点如下表所示。通常情况下,在业务低峰期且希望执行效率高时,可以优先选择使用OPTIMIZE TABLE命令来回收表空间。若您希望尽可能地降低对集群负载的影响且对执行效率不敏感时,可以优先选择使用DMS工具来回收表空间。
回收表空间的方式 | 对比项 | ||
是否允许并发读写 | 执行速度 | 是否支持限流 | |
是 | 快 | 否 | |
是 | 慢 | 是 |
如需了解更多关于回收表空间的内容,请搜索钉钉群号加群进行咨询。钉钉群号:15375044501。
前提条件
集群的数据库引擎为InnoDB,且表中不包含全文索引。
注意事项
当目标表的碎片率较低时,执行OPTIMIZE TABLE命令不能显著降低表空间大小。您可以通过
information_schema.tables
中的DATA_FREE
字段来查看目标表的碎片率。执行OPTIMIZE TABLE语句时,表数据会复制到新建的临时表中,会临时增加集群的存储空间使用率。
对于不包含全文索引的表,OPTIMIZE TABLE语句使用Online DDL方式执行,允许并发读写。
对大表执行OPTIMIZE TABLE操作会带来突发的IO和Buffer使用量,可能会导致锁表和抢占资源,在业务高峰期执行该操作可能会导致集群不可用以及监控断点。建议在业务低峰期执行该操作。
操作步骤
通过OPTIMIZE TABLE命令回收表空间
执行以下命令,回收表空间。
OPTIMIZE TABLE [$Database1].[Table1],[$Database2].[Table2]
其中,[$Database1]和[$Database2]为数据库名称,[Table1]和[Table2]为表名。
在InnoDB引擎中执行OPTIMIZE TABLE语句时,会出现以下提示信息,该信息是正常返回的结果,您可以忽略该信息,确认返回ok即可。关于更多OPTIMIZE TABLE语句的详细信息请参见OPTIMIZE TABLE Statement。
Table does not support optimize, doing recreate + analyze instead
通过DMS回收表空间
- 登录PolarDB控制台。
- 在控制台左上角,选择集群所在地域。
- 找到目标集群,单击集群ID。
单击页面右上角的登录数据库。
在左侧选择目标集群ID,双击目标库,右键单击任意表名,然后选择批量操作表。
勾选需要释放空间的表名,选择表维护>优化表。
在弹出的优化表对话框中,确认优化信息无误后,单击确认。