本文将介绍如何回收表空间。
前提条件
集群的数据库引擎为InnoDB,且表中不包含全文索引。
注意事项
使用DELETE语句删除数据时,只是将记录的位置或者数据页标记为可复用,但是存储空间中文件的大小不会改变,即表空间不会直接被回收。此时,您可以通过执行OPTIMIZE TABLE命令或使用DMS工具来回收表空间。
当目标表的碎片率较低时,执行OPTIMIZE TABLE命令不能显著降低表空间大小。您可以通过
information_schema.tables
中的DATA_FREE
字段来查看目标表的碎片率。执行OPTIMIZE TABLE语句时,表数据会复制到新建的临时表中,这会临时增加集群的存储空间使用率。
对于不包含全文索引的表,OPTIMIZE TABLE语句使用Online DDL方式执行,允许并发读写。
对大表执行OPTIMIZE TABLE操作会带来突发的IO和Buffer使用量,可能会导致锁表和抢占资源,在业务高峰期执行该操作可能会导致集群不可用以及监控断点。建议在业务低峰期执行该操作。
使用DMS工具或OPTIMIZE TABLE命令均可以回收表空间,两种方式各自的特点如下表所示。
业务低峰期且希望执行效率高时
优先选择:使用
OPTIMIZE TABLE
命令来回收表空间。适用场景:在业务负载较轻、对执行效率要求较高的情况下,
OPTIMIZE TABLE
可以快速回收表空间,降低集群的空间使用开销。
希望尽可能降低对集群负载的影响且对执行效率不敏感时
优先选择:使用DMS(Database Management System)工具来回收表空间。
适用场景:在对集群负载敏感、对执行效率不敏感的情况下,DMS工具能够以对业务影响较低的方式对表空间进行回收,降低空间回收操作对集群性能的影响。
回收表空间的方式 | 对比项 | ||
是否允许并发读写 | 执行速度 | 是否支持限流 | |
是 | 快 | 否 | |
是 | 慢 | 是 |
如需了解更多关于回收表空间的内容,请搜索钉钉群号加群进行咨询。钉钉群号:15375044501。
操作步骤
通过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,双击目标库,右键单击任意表名,然后选择批量操作表。
勾选需要释放空间的表名,选择表维护>优化表。
在弹出的优化表对话框中,确认优化信息无误后,单击确认。